NoClassDefFoundError en la dependencia de Maven

Mi primer uso de Maven y estoy atascado con las dependencias.

Creé un proyecto Maven con Eclipse y agregué dependencias, y funcionó sin problemas.

Pero cuando bash ejecutarlo a través de la línea de comandos:

$ 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 

Descarga dependencias, comstack con éxito, pero cuando bash ejecutarlo, obtengo 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 

Mi pom.xml es así:

  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     

¿Alguien puede ayudarme?

cuando bash ejecutarlo, obtengo NoClassDefFoundError

Ejecutarlo ¿cómo? Probablemente estés intentando ejecutarlo con eclipse sin haber importado correctamente tu ruta de acceso maven. Vea el plugin m2eclipse para integrar maven con eclipse para eso.

Para verificar que su configuración de maven es correcta, puede ejecutar su aplicación con el complemento de ejecución usando:

 mvn exec:java -D exec.mainClass= 

Actualización: Primero, con respecto a su error al ejecutar exec:java , su clase principal es tr.edu.hacettepe.cs.b21127113.bil138_4.App . Cuando se habla de nombres de clase, están (casi) siempre separados por puntos. El nombre de clase simple es solo la última parte: App en tu caso. El nombre totalmente calificado es el paquete completo más el nombre de clase simple, y eso es lo que le da a maven o java cuando quiere ejecutar algo. Lo que intentaba usar era una ruta del sistema de archivos a un archivo fuente. Esa es una bestia completamente diferente. Un nombre de clase generalmente se traduce directamente en un archivo de clase que se encuentra en la ruta de clase, en comparación con un archivo de origen en el sistema de archivos. En su caso específico, el archivo de clase en cuestión probablemente estaría en target/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.class porque maven comstack a target/classes , y java tradicionalmente crea un directorio para cada nivel de embalaje.

Tu problema original es simplemente que no has puesto las jarras Jackson en tu camino de clase. Cuando ejecuta un progtwig Java desde la línea de comando, debe establecer la ruta de la clase para que sepa de dónde puede cargar las clases. Has añadido tu propio jar, pero no los otros obligatorios. Tu comentario me hace pensar que no entiendes cómo crear manualmente una ruta de clase. En resumen, la ruta de clase puede tener dos cosas: directorios que contienen archivos de clase y jar que contienen archivos de clase. Los directorios que contienen jarras no funcionarán. Para obtener más detalles sobre la creación de una ruta de clase, consulte ” Configuración de la ruta de clase ” y la documentación de la herramienta java y javac .

La ruta de clase debe ser al menos, y sin las líneas de alimentación:

 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 

Tenga en cuenta que el separador en Windows es un punto y coma (;).

Me disculpo por no haberlo notado antes. El problema estaba ahí en tu publicación original, pero lo extrañé.

De forma predeterminada, Maven no agrupa las dependencias en el archivo JAR que crea, y no las está proporcionando en el classpath cuando intenta ejecutar su archivo JAR en la línea de comandos. Esta es la razón por la cual Java VM no puede encontrar los archivos de clase de la biblioteca cuando intenta ejecutar su código.

Puede especificar manualmente las bibliotecas en el classpath con el parámetro -cp , pero eso rápidamente se convierte en fastidioso.

Una mejor solución es “sombrear” el código de la biblioteca en su archivo JAR de salida. Hay un plugin de Maven llamado maven-shade-plugin para hacer esto. Debes registrarlo en tu POM, y automáticamente creará un “uber-JAR” que contiene tus clases y las clases para tu código de biblioteca cuando mvn package .

Para agrupar simplemente todas las bibliotecas requeridas, agregue lo siguiente a su POM:

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

Una vez hecho esto, puede volver a ejecutar los comandos que utilizó anteriormente:

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

Si desea realizar una configuración adicional del plugin de sombreado en términos de qué JAR se deben incluir, especificar una clase principal para un archivo JAR ejecutable, y así sucesivamente, consulte la sección “Ejemplos” en el sitio maven-shade-plugin .

Esto se debe a que Morphia Jar no forma parte de tu guerra / jar de salida. Eclipse o comstackción local los incluye como parte de la ruta de clase, pero las construcciones remotas o la comstackción automática / progtwigda no los consideran parte de la ruta de clases.

Puede incluir jarras dependientes usando el plugin.

Agrega el siguiente fragmento en la sección de complementos de tu pom

   maven-assembly-plugin 3.0.0   jar-with-dependencies    

Tienes que hacer classpath en el archivo pom para tu dependencia. Por lo tanto, debe copiar todas las dependencias en un solo lugar.

Revisa mi 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       

Elegir Project -> Clean debería resolver esto