NoClassDefFoundError auf Maven-Abhängigkeit
Mein Erster Einsatz von Maven und ich bin stecken mit Abhängigkeiten.
Erstellte ich ein Maven-Projekt mit Eclipse und Abhängigkeiten Hinzugefügt, und es funktioniert ohne Probleme.
Aber wenn ich versuche, führen Sie es über die Kommandozeile:
$ 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
Lädt es Abhängigkeiten, erfolgreich baut, aber wenn ich versuche es zu starten, 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
Meine pom.xml ist wie diese:
<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?
InformationsquelleAutor der Frage utdemir | 2012-05-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausführen, wie? Du bist wahrscheinlich versuchen, führen Sie es mit eclipse zimmerreserviereung, ohne das Sie korrekt importiert Ihre maven classpath. Finden Sie die m2eclipse plugin für die Integration von maven in eclipse.
Um zu überprüfen, dass Ihre maven config korrekt ist, könnten Sie führen Sie Ihre app mit der exec-plugin mit:
Update: Erste, zu Ihrem Fehler beim ausführen
exec:java
Ihre main-Klassetr.edu.hacettepe.cs.b21127113.bil138_4.App
. Wenn man über die Klassennamen, Sie sind (fast) immer mit einem Punkt getrennt. Der einfache Klassenname ist nur der Letzte Teil:App
in Ihrem Fall. Der vollständig qualifizierte Dateiname ist der vollständige Paket plus-die einfache Klasse name, und das ist, was Sie geben, maven oder java, wenn Sie wollen noch etwas laufen. Was Sie versuchen zu verwenden, wurde ein file-system-Pfad zu einer Quelldatei. Das ist ein ganz anderes Biest. Der name einer Klasse in der Regel übersetzt sich direkt in eine class-Datei gefunden, in der Klasse Weg, als im Vergleich zu einer source-Datei in der Datei-system. In Ihrem speziellen Fall, die class-Datei in Frage würde wohl beitarget/classes/tr/edu/hacettepe/cs/b21127113/bil138_4/App.class
weil maven kompilierttarget/classes
- und java traditionell erstellt ein Verzeichnis für jede Ebene der Verpackung.Ihre ursprüngliche problem ist einfach, dass Sie noch nicht die Jackson-Gläser in Ihrer Klasse Weg. Wenn Sie ein java-Programm von der Befehlszeile aus verwenden, müssen Sie die class-path, um ihn wissen zu lassen, wo es laden können Klassen aus. Die Sie Hinzugefügt haben, Ihre eigenen jar, aber die anderen nicht als erforderlich angesehen. Ihr Kommentar lässt mich denken, dass Sie nicht verstehen, wie man manuell erstellen eine Klasse Weg. Kurz gesagt, die Klasse path können zwei Dinge haben: - Verzeichnisse mit class-Dateien und Gläser mit class-Dateien. Verzeichnisse an, die Gläser nicht funktionieren. Für mehr details über den Aufbau einer Klasse-Pfad finden Sie unter "Festlegen der class-path" und die java und javac tool-Dokumentation.
Ihrer Klasse Weg müssten es mindestens sein, und ohne die Zeilenumbrüche:
Beachten Sie, dass der separator unter Windows ist ein Semikolon (;).
Ich entschuldige mich für nicht zu bemerken, dass es früher. Das problem saß in Ihrem ursprünglichen Beitrag, aber ich vermisste es.
InformationsquelleAutor der Antwort Ryan Stewart
Standardmäßig, Maven nicht bundle-Abhängigkeiten in der JAR-Datei baut, und Sie sind nicht, die Sie auf dem Klassenpfad, wenn Sie versuchen, führen Sie die JAR-Datei in der Befehlszeile. Dies ist der Grund, warum die Java VM nicht finden können, die Bibliothek-Klasse-Dateien beim ausführen der code.
Könnten Sie manuell festlegen, dass die Bibliotheken in den Klassenpfad mit der
-cp
parameter, aber das wird schnell langweilig.Eine bessere Lösung ist die "Schatten" der code der Bibliothek in Ihrer Ausgabe JAR-Datei. Es ist ein Maven-plugin namens der maven-shade-plugin, dies zu tun. Sie müssen registrieren, um Sie in Ihrer POM, und es erstellt automatisch ein "uber-JAR" mit den Klassen und den Klassen für Ihre Bibliothek-code zu, wenn Sie Sie ausführen
mvn package
.Einfach bündeln alle erforderlichen Bibliotheken, fügen Sie den folgenden, um Ihre POM:
Sobald dies erledigt ist, können Sie erneut ausführen die Befehle, die Sie oben verwendet:
Wenn Sie wollen, um die weitere Konfiguration des Schatten-plugin in Bezug auf das, was Gläser sollten enthalten sein, die Angabe einer Main-Klasse für eine ausführbare JAR-Datei, und so weiter, siehe den Abschnitt "Beispiele" auf der maven-shade-plugin-site.
InformationsquelleAutor der Antwort Matt Ryall
Dies ist aufgrund Morphia jar nicht als Teil der output war/jar. Eclipse oder lokale bauen, gehören Sie als Teil des classpath, aber die Fernbedienung baut oder auto/geplant bauen nicht betrachten Sie als Teil des classpath.
Können Sie auch die abhängigen jars mit plugin.
Füge unten-snippet in Ihre pom - plugins Abschnitt
InformationsquelleAutor der Antwort Satya
Wahl auf Project -> Clean-sollte dies beheben,
InformationsquelleAutor der Antwort user2009677