NoClassDefFoundError sur la dépendance Maven

Ma première utilisation de Maven et je suis coincé avec des dépendances.

J’ai créé un projet Maven avec Eclipse et ajouté des dépendances, et cela fonctionnait sans problème.

Mais quand j’essaie de l’exécuter via la ligne de commande:

$ mvn package # successfully completes $ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App # NoClassDefFoundError for dependencies 

Il télécharge les dépendances, construit avec succès, mais quand j’essaie de l’exécuter, j’obtiens NoClassDefFoundError:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonParseException at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.(DatabaseManager.java:16) at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.(DatabaseManager.java:22) at tr.edu.hacettepe.cs.b21127113.bil138_4.App.main(App.java:10) Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.JsonParseException at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:321) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:266) ... 3 more 

Mon pom.xml est comme ceci:

  4.0.0 tr.edu.hacettepe.cs.b21127113 bil138_4 0.0.1-SNAPSHOT jar bil138_4 http://maven.apache.org  UTF-8    org.codehaus.jackson jackson-core-asl   org.codehaus.jackson jackson-mapper-asl      org.codehaus.jackson jackson-core-asl 1.9.6   org.codehaus.jackson jackson-mapper-asl 1.9.6     

Quelqu’un peut-il m’aider?

quand j’essaie de l’exécuter, j’obtiens NoClassDefFoundError

Exécutez le comment? Vous essayez probablement de l’exécuter avec eclipse sans avoir correctement importé votre classpath maven. Voir le plugin m2eclipse pour intégrer maven avec eclipse pour cela.

Pour vérifier que votre configuration Maven est correcte, vous pouvez exécuter votre application avec le plug-in exec en utilisant:

 mvn exec:java -D exec.mainClass= 

Mise à jour: Tout d’abord, en ce qui concerne votre erreur lors de l’exécution de exec:java , votre classe principale est tr.edu.hacettepe.cs.b21127113.bil138_4.App . Quand on parle de noms de classe, ils sont (presque) toujours séparés par des points. Le nom de classe simple n’est que la dernière partie: App dans votre cas. Le nom complet est le package complet plus le nom de classe simple, et c’est ce que vous donnez à maven ou java lorsque vous voulez exécuter quelque chose. Ce que vous tentiez d’utiliser était un chemin de système de fichiers vers un fichier source. C’est une bête complètement différente. Un nom de classe se traduit généralement directement par un fichier de classe trouvé dans le chemin de classe, par rapport à un fichier source du système de fichiers. Dans votre cas spécifique, le fichier de classe en question serait probablement à la target/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.class car target/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.class comstack en target/classes et java crée traditionnellement un répertoire pour chaque niveau de l’emballage.

Votre problème initial est simplement que vous n’avez pas mis les jar Jackson dans votre chemin de classe. Lorsque vous exécutez un programme Java à partir de la ligne de commande, vous devez définir le chemin d’access aux classes pour qu’il sache d’où il peut charger les classes. Vous avez ajouté votre propre pot, mais pas les autres requirejs. Votre commentaire me fait penser que vous ne comprenez pas comment créer manuellement un chemin de classe. En bref, le chemin de classe peut avoir deux choses: des répertoires contenant des fichiers de classe et des fichiers JAR contenant des fichiers de classe. Les répertoires contenant des jars ne fonctionneront pas. Pour plus de détails sur la création d’un chemin de classe, voir ” Définition du chemin de classe ” et la documentation de l’outil Java et javac .

Votre chemin de classe devrait être au moins et sans les sauts de ligne:

 target/bil138_4-0.0.1-SNAPSHOT.jar: /home/utdemir/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.6/jackson-core-asl-1.9.6.jar: /home/utdemir/.m2/repository/org/codehaus/jackson/jackson-mapper-asl/1.9.6/jackson-mapper-asl-1.9.6.jar 

Notez que le séparateur sous Windows est un point-virgule (;).

Je m’excuse de ne pas l’avoir remarqué plus tôt. Le problème était assis là dans ton post original, mais ça me manquait.

Par défaut, Maven ne regroupe pas les dépendances dans le fichier JAR qu’il génère, et vous ne les fournissez pas dans le chemin d’access aux classes lorsque vous essayez d’exécuter votre fichier JAR sur la ligne de commande. C’est pourquoi la machine virtuelle Java ne trouve pas les fichiers de classe de bibliothèque lorsque vous essayez d’exécuter votre code.

Vous pouvez spécifier manuellement les bibliothèques sur le chemin de classe avec le paramètre -cp , mais cela devient vite fastidieux.

Une meilleure solution consiste à “ombrer” le code de la bibliothèque dans votre fichier JAR de sortie. Pour ce faire, il existe un plugin Maven appelé maven-shade-plugin . Vous devez l’enregistrer dans votre POM, et il va automatiquement créer un “uber-JAR” contenant vos classes et les classes pour votre code de bibliothèque lorsque vous exécuterez le mvn package .

Pour regrouper simplement toutes les bibliothèques requirejses, ajoutez ce qui suit à votre POM:

  ...    org.apache.maven.plugins maven-shade-plugin 1.6   package  shade       ...  

Une fois cela fait, vous pouvez réexécuter les commandes que vous avez utilisées ci-dessus:

 $ mvn package $ java -cp target/bil138_4-0.0.1-SNAPSHOT.jar tr.edu.hacettepe.cs.b21127113.bil138_4.App 

Si vous souhaitez effectuer une configuration supplémentaire du plug-in de nuage en termes de JAR à inclure, en spécifiant une classe principale pour un fichier JAR exécutable, etc., reportez-vous à la section “Exemples” du site maven-shade-plugin .

Cela est dû au fait que Morphia jar ne fait pas partie de votre guerre / jar de sortie. Eclipse ou build local les inclut dans classpath, mais les constructions distantes ou la construction automatique / programmée ne les considèrent pas comme faisant partie du classpath.

Vous pouvez inclure des jars dépendants en utilisant un plugin.

Ajouter l’extrait ci-dessous dans la section des plugins de pom

   maven-assembly-plugin 3.0.0   jar-with-dependencies    

Vous devez créer classpath en fichier pom pour votre dépendance. Par conséquent, vous devez copier toutes les dépendances en un seul endroit.

Vérifiez mon blog .

    org.apache.maven.plugins maven-dependency-plugin 2.1   copy-dependencies package  copy-dependencies   ${project.build.directory}/lib false false true      org.apache.maven.plugins maven-jar-plugin 2.4    true lib/ $fullqualified path to your main Class       

Choisir de projeter -> Nettoyer devrait résoudre ce problème