2017-10-19 8 views
0

Je suis débutant avec Java et j'ai des problèmes lorsque je lance mon .jar. J'ai reçu une ClassNotFoundException sur une classe netty. Il semble logique que mon .jar ne trouve pas les classes de netty.Java: ClassNotFoundException lors de l'exécution du programme avec netty [Gradle]

Voici ma trace:

Exception in thread "main" java.lang.NoClassDefFoundError: io/netty/channel/EventLoopGroup 
 
\t at src.Main.main(Main.java:14) 
 
Caused by: java.lang.ClassNotFoundException: io.netty.channel.EventLoopGroup 
 
\t at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source) 
 
\t at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source) 
 
\t at java.base/java.lang.ClassLoader.loadClass(Unknown Source) 
 
\t ... 1 more

La compilation fonctionne très bien avec gradle. Ma build.gradle principale appelle 2 build.gradle dans différents dossiers qui compilent le programme. Voici ma principale build.gradle:

subprojects { 
 
     apply plugin: 'java' 
 

 
     repositories { 
 
       mavenCentral() 
 
     } 
 

 
     dependencies { 
 
       compile 'io.netty:netty-all:4.1.16.Final' 
 
       compile files("./lib/netty-all-4.1.16.Final.jar") 
 
       testCompile 'junit:junit:4.12' 
 
     } 
 
}

Et voici une build.gradle qui est invoquée par le principal build.gradle, il compile mon sources.java:

apply plugin: "java" 
 

 
sourceSets { 
 
     main.java.srcDir "./src/" 
 
} 
 

 
jar { 
 
     manifest.attributes "Main-Class": "src.Main" 
 
     destinationDir project.file('../Jar/') 
 
     baseName 'Server' 
 
}

Mon arbre ressemble à ce fichier:

MyProject 
 
--> build.gradle 
 
--> settings.gradle 
 
--> lib [DIR] 
 
    --> netty-all-4.1.16.Final.jar 
 
--> server [DIR] 
 
    --> build.gradle 
 
    --> src [DIR] 
 
     --> Main.java

Je ne comprends pas pourquoi quand je compile tout fonctionne, et quand je le lance ne trouve pas les classes netty.

Pourriez-vous s'il vous plaît aide-moi? Merci! Lorsque vous exécutez à partir de la ligne de commande, vous n'ajoutez pas les fichiers jar au chemin d'accès à l'exécution qui étaient présents sur le chemin de classe de l'heure de la compilation.

+0

Comment utilisez-vous votre application? Utilisez-vous Gradle ou l'invoquez-vous directement? L'exception indique que les classes Netty ne se trouvent pas dans votre chemin de classe d'exécution. –

+0

Salut Oz, pour compiler j'utilise 'build gradle', et pour exécuter mon .jar j'utilise java -jar myjar.jar – Fake

+0

Vous pouvez regarder cette réponse: https://stackoverflow.com/a/18413058/327680 –

Répondre

1

Il est probablement plus facile de créer une tâche de coureur Gradle comme suit:

task runMyApp(type: JavaExec) { 
    dependsOn 'classes' 
    main = 'src.Main' 
    classpath = sourceSets.main.runtimeClasspath 
} 

Je vous suggère d'utiliser le application plugin qui regrouperons votre pot compilé dans un zip (ou goudron) fichier à côté des pots de dépendance, il créera également un script de démarrage pour windows et unix. Il ajoute également une tâche installDist qui déploie l'application pour s'exécuter localement à partir de la ligne de commande.

En outre, le référencement de bocaux locaux est une mauvaise idée. Si possible, vous devriez obtenir vos dépendances à partir d'un dépôt. -À-dire ce qui suit est mauvais

compile files("./lib/netty-all-4.1.16.Final.jar") 
+0

Merci pour votre aide, j'enlève cette ligne, ça marche bien sans ça – Fake

0

Ok, j'avais un manifeste dans mon build.gradle et maintenant il fonctionne, mais je suis en train d'avertissement lors de l'exécution:

WARNING: An illegal reflective access operation has occurred 
 
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/Users/AK1/Java/Java_jcoinche_2017/lib/netty-all-4.1.16.Final.jar) to constructor java.nio.DirectByteBuffer(long,int) 
 
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil 
 
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations 
 
WARNING: All illegal access operations will be denied in a future release

ici est mon manifeste ajouté dans ma construction.fichier gradle:

jar { 
 
\t \t manifest { 
 
\t \t \t attributes("Implementation-Title": "Server", 
 
       \t "Implementation-Version": "1.0", 
 
\t \t \t "Class-Path": "../lib/netty-all-4.1.16.Final.jar") 
 
\t \t } 
 
\t }

Je pense que ce que je l'ai fait est une mauvaise pratique. Y a-t-il un meilleur moyen?