2012-05-12 12 views
40

Mi primer uso de Maven y estoy atascado con las dependencias.NoClassDefFoundError en la dependencia de Maven

Creé un proyecto de Maven con Eclipse y agregué dependencias, y estaba funcionando sin problemas.

Pero cuando intento ejecutarlo a través de 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, construye con éxito, pero cuando intento ejecutarlo, me sale NoClassDefFoundError:

Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonParseException 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(DatabaseManager.java:16) 
     at tr.edu.hacettepe.cs.b21127113.bil138_4.db.DatabaseManager.<init>(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í:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>tr.edu.hacettepe.cs.b21127113</groupId> 
    <artifactId>bil138_4</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>bil138_4</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies>   
    <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId>   
    </dependency> 
     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId>    
     </dependency> 
    </dependencies> 
    <dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.6</version> 
    </dependency> 
    </dependencies> 
    </dependencyManagement> 
</project> 

¿Alguien me puede ayudar?

Respuesta

16

when I try to run it, I get NoClassDefFoundError

Ejecútelo ¿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 es correcta experto, podría ejecutar su aplicación con el exec plugin usando:

mvn exec:java -D exec.mainClass=<your main class> 

Actualización: En primer lugar, 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 su 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 compila a target/classes, y java tradicionalmente crea un directorio para cada nivel de empaque.

Su problema original es simplemente que no ha puesto las jarras Jackson en su camino de clase. Cuando ejecuta un programa 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 "Setting the class path" y la documentación de la herramienta java y javac.

su ruta de clase tendría que ser, al menos, y sin que alimenta la línea:

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 

Observe que el separador de Windows es un punto y coma (;).

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

+0

Obteniendo este error: http://pastebin.com/g2txkMY6. Puedo ejecutarlo en eclipse con el plugin m2eclipse, desarrollé la aplicación en él. No puedo entender cómo ejecutarlo a través de la línea de comando. ¿Y cómo importar mi ruta de clases maven? Edición: Intenté agregar el parámetro -classpath /home/utdemir/.m2/repository/ al comando java, todavía no tuve suerte. – utdemir

+1

Actualizado mi respuesta. –

+0

Gracias. Establecer el classpath como dices solucionó el problema, marcando la pregunta como resuelta.Pero tengo algunas preguntas más: 1- ¿Por qué no tengo que agregar Jackson a classpath para el complemento de ejecución? 2- El plugin de Exec necesita que mi proyecto sea compilado, así que debería haber ejecutado mvn compilación o paquete, ¿no? 3- Este código es mi tarea, ¿es responsabilidad de agregar bibliotecas en sus classpaths o tengo que hacer algo al respecto? – utdemir

80

De forma predeterminada, Maven no agrupa las dependencias en el archivo JAR que crea, y no las está proporcionando en el classpath cuando está intentando 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 se vuelve tedioso rápidamente.

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

Para ello basta con empaquetar todas las bibliotecas necesarias, añada lo siguiente a su POM:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.6</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

Una vez hecho esto, puede volver a ejecutar los comandos que ha utilizado anteriormente:

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

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

+3

En caso de que alguien se encuentre con esta respuesta, aquí es donde puede obtener una versión real del complemento, porque 1.6 es bastante antiguo ahora: http://mvnrepository.com/artifact/org.apache.maven.plugins/maven-shade -plugin – Scadge

2

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

mira mi blog. http://madhawagunasekara.blogspot.com/2014/10/solving-javalangnoclassdeffounderror-in.html

<build> 
 
    <plugins> 
 
    <plugin> 
 
    <groupId>org.apache.maven.plugins</groupId> 
 
    <artifactId>maven-dependency-plugin</artifactId> 
 
    <version>2.1</version> 
 
    <executions> 
 
    <execution> 
 
     <id>copy-dependencies</id> 
 
     <phase>package</phase> 
 
     <goals> 
 
     <goal>copy-dependencies</goal> 
 
     </goals> 
 
     <configuration> 
 
     <outputdirectory>${project.build.directory}/lib</outputdirectory> 
 
     <overwritereleases>false</overwritereleases> 
 
     <overwritesnapshots>false</overwritesnapshots> 
 
     <overwriteifnewer>true</overwriteifnewer> 
 
     </configuration> 
 
    </execution> 
 
    </executions> 
 
    </plugin> 
 
    <plugin> 
 
    <groupId>org.apache.maven.plugins</groupId> 
 
    <artifactId>maven-jar-plugin</artifactId> 
 
    <version>2.4</version> 
 
    <configuration> 
 
    <archive> 
 
     <manifest> 
 
     <addClasspath>true</addClasspath> 
 
     <classpathPrefix>lib/</classpathPrefix> 
 
     <mainClass>$fullqualified path to your main Class</mainClass> 
 
     </manifest> 
 
    </archive> 
 
    </configuration> 
 
    </plugin> 
 
    
 
    </plugins> 
 
    
 
    
 
</build>

-2

La elección de proyecto -> limpia debe resolver este

2

Esto se debe a Morphia tarro de no ser parte de su guerra de salida/frasco. Eclipse o compilación local los incluye como parte de la ruta de clase, pero las construcciones remotas o la compilación automática/programada no los consideran parte de la ruta de clases.

Puede incluir tarros dependientes mediante el complemento.

Añadir a continuación fragmento en la sección de plugins de su pom

<plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>3.0.0</version> 
     <configuration> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
-1

En mi caso, los binarios de Maven se colocaron en una carpeta segura en mi portátil de la empresa (Archivos de programa \ experto), causando problemas experto para tirar/guardar dependencias repositorios, por lo tanto, no se encuentran DEP (NoClassDefFoundError)

Sólo tiene que colocar experto en c: \ experto

Instructions

+0

Esta respuesta no tiene nada que ver con la pregunta del OP. – shiri

+0

En mi caso, el error fue el mismo: NoClassDefFoundError Motivo: las dependencias de Java del proyecto no se encontraron; maven no fue capaz de crear/administrar el repositorio correctamente. Este error desapareció después de aplicar esta solución, compartida arriba ... @shiri ¿Cómo puede decir que mi respuesta no tiene nada que ver con la pregunta? – cepix

Cuestiones relacionadas