Java NoClassDefFoundError trotz set classpath
Ich habe einige Schwierigkeiten mit dem Erhalt einer Java-Anwendung ausführen, in der Konsole und/oder mit Ant.
Ich weiß, dass eine Menge von Start-Problemen, der classpath nicht gesetzt oder falsch gesetzt, aber ich bin mir ziemlich sicher, dass ich es korrekt, also meine Suche ergab nur Ergebnisse auf, die.
Hier ist den Allgemeinen Aufbau meiner Anwendung:
Klassen sind in packages model, view und controller. controller.Controller ist die Klasse mit der main-Methode. Ich bin mit objectdb als meine JPA-provider.
Ich bin mit Ant kompilieren meiner Anwendung.
Nach dem kompilieren kann ich meine Anwendung von ant mit dem folgenden Skript:
<target name="run" description="default build process">
<java fork="true" classname="${main-class}">
<classpath>
<path refid="classpath" />
</classpath>
</java>
</target>
wobei ${main-class} ist controller.Controller und classpath besteht aus /lib und /dist Ordner (der Anwendung-jar-Datei kompiliert wird /dist)
Nun habe ich versucht, das kopieren alle .jar-Dateien aus /lib und /dist, um einen separaten Ordner und führen Sie Sie mitjava -jar cooking.jar -cp .
die Ergebnisse in
Exception in thread "main" java.lang.NoClassDefFoundError: javax/persistence/Persistence
at model.jpa.JPAModelFactory.<init>(JPAModelFactory.java:28)
at model.jpa.JPAModelFactory.<init>(JPAModelFactory.java:24)
at controller.Controller.<init>(Controller.java:59)
at controller.Controller.main(Controller.java:116)
Caused by: java.lang.ClassNotFoundException: javax.persistence.Persistence
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 4 more
Also habe ich versucht ant und leicht modifiziert, die oben bauen Ziel:
<target name="run2" description="default build process">
<java fork="true" jar="${dist.dir}/${ant.project.name}.jar">
<classpath>
<path refid="classpath" />
</classpath>
</java>
</target>
die Ergebnisse in die gleichen Fehler. Ich verstehe nicht, warum.
Nur um es zu testen, ich habe versucht, über die Befehlszeile ausgeführt durch die Angabe der main-Klasse direkt: java -cp . controller.Controller
die aus irgendeinem Grund nicht selbst suchen Sie die Klasse (es ist da, ich bestätigte es):
Exception in thread "main" java.lang.NoClassDefFoundError: controller/Controller
Caused by: java.lang.ClassNotFoundException: controller.Controller
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: controller.Controller. Program will exit.
Ich habe JAVA_HOME auf mein JDK-path und CLASSPATH zu meiner JRE s/lib-Pfad.
OS ist Windows 7 64 bit, Java version 1.6.0_25-b06
Ich staune über zwei Dinge:
a) Warum ist Java nicht finden-controller.Controller, obwohl es vorhanden ist .jar-Datei und der .jar-Datei in das aktuelle Verzeichnis ist?
b) Was mache ich falsch, dass der Aufruf mit Java -jar scheint in Unordnung zu bringen, die lookup-Mechanismen.
Jede Hilfe wird sehr geschätzt.
- Was sehen Sie in Ihrem Manifest.MF Datei den class-path und Main-class-Eintrag?
- Manifest-Version: 1.0 Ant-Version: Apache Ant 1.7.1 Erstellt Von: 20.0-b11 (Sun Microsystems, Inc.) Main-Klasse: - controller.Controller
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den class-path sollte aus
Sie können die Klasse Pfad zu einem Verzeichnis der Gläser. Die Dinge sind anders, wenn ein application server (z.B. Tomcat), die geladen werden, die Gläser aus einem Verzeichnis für Sie.
Die Beweise gegen Sie. Die JVM sagen, dass Sie nicht setzen es richtig ein.
Was denken Sie, dass die ref 'classpath' zu zeigen? Wo muss man davon ausgehen, dass seine Werte kommen? Sie sollten definiert werden, innerhalb der Ant build.xml, richtig? Wie diese:
Wenn Sie eine ausführbare JAR-Datei, müssen Sie die main-Klasse und classpath im manifest, als CoolBeans richtig darauf hingewiesen, in den Kommentar. Die 3rd-party JAR-Standorte haben relativ zu der ausführbaren JAR. Sie sollten in einem Paket mit Ihren ausführbare JAR-Datei in einer solchen Weise, dass der relative Pfad ist leicht zu Sortieren und zu verstehen.
Ich habe festgestellt, dass dies passiert, wenn ich angeben beide die
<classpath>
und diejar="..."
im Ziel. Ich entfernte diejar="..."
platziert, dass.jar
in die<classpath>
Liste und es lief danach.