我有一個應用程序,我試圖將其包裝到一個jar中以便於部署。當作爲一組可從CLASSPATH訪問的類運行時,應用程序編譯並運行良好(在Windows cmd窗口中)。但是,當我罐子了我的課,並嘗試在同一個cmd窗口的Java 1.6中運行它,我開始越來越異常:NoClassDefFoundError嘗試運行我的jar與java.exe -jar ...有什麼不對?
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
有趣的是,有問題的LogFactory似乎是在共享記錄-1.1 .jar,它位於指定的類路徑中。該jar文件(是的,它真的存在):
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
的共享記錄-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 ...)
是的,共享記錄具有的LogFactory類。最後,我罐子的清單的內容:
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
這難倒我,和任何同事現在我已經竊聽了超過一天。只是爲了剔除答案,至少現在第三方解決方案可能是由於許可限制和公司政策(例如:用於創建exe或打包jar的工具)。最終目標是創建一個jar文件,可以從我的開發Windows機器複製到Linux服務器(使用任何依賴jar)並用於填充數據庫(因此,classpaths可能在開發和部署環境之間有所不同)。任何神祕的線索將不勝感激!
最好是在JAR的清單中指定一個類路徑。 bootclasspath用於替換系統類。 – 2008-10-30 13:53:13
正確 - 將編輯它清楚這只是一個解決方法。 – toolkit 2008-10-30 14:01:15
啊哈!而已!我知道我一定有一些簡單的東西,我錯過了。只是沒有人在這裏與罐子工作足以注意到我的錯誤! – 2008-10-30 14:55:50