2012-05-12 2 views
40

Meine erste Verwendung von Maven und ich bin mit Abhängigkeiten fest.NoClassDefFoundError auf Maven Abhängigkeit

Ich habe ein Maven-Projekt mit Eclipse erstellt und Abhängigkeiten hinzugefügt, und es funktionierte ohne Probleme.

Aber wenn ich versuche es über die Befehlszeile auszuführen:

$ 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 

Es lädt Abhängigkeiten, baut erfolgreich, aber wenn ich versuche, es zu laufen, bekomme ich 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 

Mein pom .xml ist wie folgt:

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

Kann mir jemand helfen?

Antwort

16

when I try to run it, I get NoClassDefFoundError

Führen Sie es wie? Sie versuchen wahrscheinlich, es mit Eclipse auszuführen, ohne Ihren Maven-Klassenpfad korrekt importiert zu haben. Siehe das m2eclipse Plugin für die Integration von Maven mit Eclipse dafür.

Um sicherzustellen, dass Ihre Maven Config korrekt ist, können Sie Ihre App mit dem exec plugin mit laufen konnte:

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

Update: Zuerst in Bezug auf Ihre Fehler bei der Ausführung von exec:java, Ihre Hauptklasse ist tr.edu.hacettepe.cs.b21127113.bil138_4.App. Wenn Sie über Klassennamen sprechen, sind sie (fast) immer durch Punkte getrennt. Der einfache Klassenname ist nur der letzte Teil: App in Ihrem Fall. Der vollständig qualifizierte Name ist das vollständige Paket plus der einfache Klassenname, und das geben Sie maven oder java, wenn Sie etwas ausführen wollen. Sie wollten einen Dateisystempfad zu einer Quelldatei verwenden. Das ist ein ganz anderes Tier. Ein Klassenname wird im Allgemeinen direkt in eine Klassendatei übersetzt, die im Klassenpfad gefunden wird, im Vergleich zu einer Quelldatei im Dateisystem. In Ihrem speziellen Fall wäre die fragliche Klassendatei wahrscheinlich target/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.class, da maven kompiliert zu target/classes, und Java erstellt traditionell ein Verzeichnis für jede Ebene der Verpackung.

Ihr ursprüngliches Problem ist einfach, dass Sie die Jackson-Gläser nicht auf Ihren Klassenpfad gesetzt haben. Wenn Sie ein Java-Programm über die Befehlszeile ausführen, müssen Sie den Klassenpfad festlegen, um anzugeben, von wo Klassen geladen werden können. Sie haben Ihr eigenes Glas hinzugefügt, aber nicht die anderen erforderlichen. Ihr Kommentar lässt mich glauben, dass Sie nicht verstehen, wie Sie manuell einen Klassenpfad erstellen. Kurz gesagt, der Klassenpfad kann zwei Dinge haben: Verzeichnisse mit Klassendateien und jars mit Klassendateien. Verzeichnisse mit Gläsern funktionieren nicht. Weitere Informationen zum Erstellen eines Klassenpfads finden Sie unter "Setting the class path" und in der Werkzeugdokumentation java und javac.

Ihre Klassenpfad müssten zumindest sein, und ohne die Zeilenumbrüche:

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 

Beachten Sie, dass der Separator unter Windows ist ein Semikolon (;).

Ich entschuldige mich dafür, es nicht früher zu bemerken. Das Problem war, dass du in deinem ursprünglichen Post sitzt, aber ich habe es verpasst.

+0

Erhalte diesen Fehler: http://pastebin.com/g2txkMY6. Ich kann es auf Eclipse mit m2eclipse plugin ausführen, ich habe die Anwendung darauf entwickelt. Ich kann nicht einfach herausfinden, wie man es über die Befehlszeile ausführt. Und wie kann ich meinen Maven Klassenpfad importieren? Edit: Versucht mit -classpath /home/utdemir/.m2/repository/ Parameter zu Java-Befehl hinzufügen, immer noch kein Glück. – utdemir

+1

Meine Antwort wurde aktualisiert. –

+0

Vielen Dank. Wenn Sie den Klassenpfad wie angegeben einstellen, wird das Problem gelöst und die Frage als gelöst markiert.Aber ich habe noch ein paar Fragen mehr: 1- Warum muss ich Jackson nicht zum Classpath für exec plugin hinzufügen? 2- Exec-Plugin muss mein Projekt kompiliert werden, so sollte ich mvn kompilieren oder Paket ausgeführt haben, oder? 3- Dieser Code ist meine Aufgabe, ist das Hinzufügen von Bibliotheken in ihre Klassenpfade ihre Verantwortung, oder muss ich etwas dagegen tun? – utdemir

80

Standardmäßig enthält Maven keine Abhängigkeiten in der JAR-Datei, die es erstellt, und Sie stellen sie nicht im Klassenpfad bereit, wenn Sie versuchen, Ihre JAR-Datei über die Befehlszeile auszuführen. Aus diesem Grund kann die Java VM die Bibliotheksklassendateien nicht finden, wenn Sie versuchen, Ihren Code auszuführen.

Sie könnten die Bibliotheken im Klassenpfad mit dem Parameter -cp manuell angeben, was jedoch schnell ermüdend wird.

Eine bessere Lösung ist es, den Bibliothekscode in die ausgegebene JAR-Datei zu "schattieren". Es gibt ein Maven-Plugin namens maven-shade-plugin, um dies zu tun. Sie müssen es in Ihrem POM registrieren, und es wird automatisch ein "Uber-JAR" erstellt, das Ihre Klassen und die Klassen für Ihren Bibliothekscode enthält, wenn Sie mvn package ausführen.

einfach Um alle benötigten Bibliotheken zu bündeln, fügen Sie folgendes zu Ihrem 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> 

Sobald dies erledigt ist, können Sie die Befehle erneut ausführen Sie oben verwendet:

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

Wenn Sie möchten, Weitere Konfiguration des Schatten-Plugins in Bezug darauf, welche JARs enthalten sein sollten, Angabe einer Hauptklasse für eine ausführbare JAR-Datei usw., siehe Abschnitt "Beispiele" unter maven-shade-plugin site.

+3

Für den Fall, dass jemand auf diese Antwort kommt, hier ist, wo Sie eine aktuelle Version des Plugins erhalten können, weil 1.6 ist jetzt ziemlich alt: http://mvnrepository.com/artifact/org.apache.maven.plugins/maven-shade -plugin – Scadge

2

Sie müssen Klassenpfad in Pom-Datei für Ihre Abhängigkeit machen. deshalb müssen Sie alle Abhängigkeiten an einen Ort kopieren.

Überprüfen Sie meinen 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

Project Wahl -> Reinigen sollte lösen dieses

2

Dies ist darauf zurückzuführen, Morphia jar nicht Teil Ihrer Ausgabe Krieg/jar zu sein. Eclipse oder lokales Build enthält sie als Teil des Klassenpfads, aber Remote-Builds oder automatische/geplante Builds betrachten sie nicht als Teil des Klassenpfads.

Sie können abhängige Gläser mit dem Plugin hinzufügen.

unten Snippet Fügen Sie in Plugins Ihr pom der Abschnitt

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

In meinem Fall Maven Binärdateien wurden in einem gesicherten Ordner in meinem Firmenlaptop (Program Files \ Maven) platziert, Probleme Maven verursacht Abhängigkeiten zu ziehen/speichern Repositorys daher deps nicht gefunden werden (NoClassDefFoundError)

einfach setzen maven in c: \ maven

Instructions

+0

Diese Antwort hat nichts mit der Frage des OP zu tun. – shiri

+0

In meinem Fall war der Fehler der gleiche: NoClassDefFoundError Der Grund: Java-Abhängigkeiten des Projekts wurden nicht gefunden; maven konnte Repository nicht korrekt erstellen/verwalten. Dieser Fehler verschwand, nachdem ich diese Lösung angewendet habe, wie oben beschrieben ... @shiri Wie können Sie feststellen, dass meine Antwort nichts mit der Frage zu tun hat ?? – cepix