72 Stimmen

NoClassDefFoundError beim Versuch, mein jar mit java.exe -jar auszuführen...was ist los?

Ich habe eine Anwendung, die ich versuche, in ein Jar für einfachere Bereitstellung zu verpacken. Die Anwendung kompiliert und läuft gut (in einem Windows-Cmd-Fenster), wenn als eine Reihe von Klassen aus dem CLASSPATH erreichbar ausgeführt. Aber wenn ich meine Klassen in ein Jar packe und versuche, sie mit Java 1.6 im gleichen cmd-Fenster auszuführen, erhalte ich Ausnahmen:

C:\dev\myapp\src\common\datagen>C:/apps/jdk1.6.0_07/bin/java.exe -classpath C:\myapp\libs\commons -logging-1.1.jar -server -jar DataGen.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at com.example.myapp.fomc.common.datagen.DataGenerationTest.<clinit>(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    ... 1 more

Das Seltsame ist, dass die fehlerhafte LogFactory in commons-logging-1.1.jar enthalten zu sein scheint, die sich im angegebenen Klassenpfad befindet. Die jar-Datei (ja, sie ist wirklich da):

C:\dev\myapp\src\common\datagen>dir C:\myapp\libs\commons-logging-1.1.jar
 Volume in drive C is Local Disk
 Volume Serial Number is ECCD-A6A7

 Directory of C:\myapp\libs

12/11/2007  11:46 AM            52,915 commons-logging-1.1.jar
           1 File(s)         52,915 bytes
           0 Dir(s)  10,956,947,456 bytes free

Der Inhalt der Datei commons-logging-1.1.jar:

C:\dev\myapp\src\common\datagen>jar -tf C:\myapp\libs\commons-logging-1.1.jar
META-INF/
META-INF/MANIFEST.MF
org/
org/apache/
org/apache/commons/
org/apache/commons/logging/
org/apache/commons/logging/impl/
META-INF/LICENSE.txt
META-INF/NOTICE.txt
org/apache/commons/logging/Log.class
org/apache/commons/logging/LogConfigurationException.class
org/apache/commons/logging/LogFactory$1.class
org/apache/commons/logging/LogFactory$2.class
org/apache/commons/logging/LogFactory$3.class
org/apache/commons/logging/LogFactory$4.class
org/apache/commons/logging/LogFactory$5.class
org/apache/commons/logging/LogFactory.class
... (more classes in commons-logging-1.1 ...)

Ja, commons-logging hat die LogFactory-Klasse. Und schließlich der Inhalt des Manifests meines Jars:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 10.0-b23 (Sun Microsystems Inc.)
Main-Class: com.example.myapp.fomc.common.datagen.DataGenerationTest
Class-Path: commons-logging-1.1.jar commons-lang.jar antlr.jar toplink
 .jar GroboTestingJUnit-1.2.1-core.jar junit.jar

Das hat mich und alle Mitarbeiter, die ich seit mehr als einem Tag genervt habe, verblüfft. Nur um die Antworten zusammenzufassen: Zumindest im Moment sind Lösungen von Drittanbietern aufgrund von Lizenzbeschränkungen und Unternehmensrichtlinien (z.B.: Tools zum Erstellen von Exe-Dateien oder zum Verpacken von Jars) wahrscheinlich nicht möglich. Das ultimative Ziel ist es, ein Jar zu erstellen, das von meinem Windows-Entwicklungssystem auf einen Linux-Server kopiert werden kann (mit allen abhängigen Jars) und zum Auffüllen einer Datenbank verwendet werden kann (daher können die Klassenpfade zwischen Entwicklungs- und Bereitstellungsumgebung unterschiedlich sein). Für jeden Hinweis auf dieses Rätsel wären wir sehr dankbar!

0voto

Mary C Punkte 79

Ich habe festgestellt, wenn ich ein Manifest verwende, dass die Auflistung der Jars für den Klassenpfad ein Leerzeichen nach der Auflistung jedes Jars haben muss, z. B. "required_lib/sun/pop3.jar required_lib/sun/smtp.jar". Auch wenn es das letzte in der Liste ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X