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

Ich habe eine Anwendung, die ich versuche, zur einfacheren Bereitstellung in ein Glas zu packen. Die Anwendung wird ordnungsgemäß kompiliert und ausgeführt (in einem Windows-Cmd-Fenster), wenn sie als eine Gruppe von Klassen ausgeführt wird, die über CLASSPATH erreichbar sind. Aber wenn ich meine Klassen auflockere und versuche, sie mit Java 1.6 im selben Cmd-Fenster auszuführen, bekomme 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 Lustige ist, dass sich die anstößige LogFactory in der Datei commons-logging-1.1.jar befindet, die im angegebenen Klassenpfad enthalten ist. Die JAR-Datei (yep, es 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 Klasse LogFactory. Und zum Schluss der Inhalt meines Manifests:

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 verblüfft und alle Kollegen, die ich seit mehr als einem Tag abgehört habe. Nur um die Antworten zu finden, sind Lösungen von Drittanbietern wahrscheinlich aufgrund von Lizenzbeschränkungen und Unternehmensrichtlinien (z. B. Tools zum Erstellen von Exes oder zum Verpacken von Gläsern) nicht verfügbar. Das ultimative Ziel ist es, eine JAR-Datei zu erstellen, die von meiner Windows-Entwicklungs-Box auf einen Linux-Server (mit abhängigen JAR-Dateien) kopiert und zum Auffüllen einer Datenbank verwendet werden kann (sodass sich die Klassenpfade zwischen Entwicklungs- und Bereitstellungsumgebung unterscheiden können). Hinweise auf dieses Rätsel wären sehr dankbar!

Antworten auf die Frage(6)

Ihre Antwort auf die Frage