デプロイを簡単にするためにjarにラップしようとしているアプリケーションがあります。CLASSPATHから到達可能なクラスのセットとして実行すると、アプリケーションはコンパイルされ、正常に実行されます(Windowsのcmdウィンドウで)。しかし、クラスをjarにして、同じcmdウィンドウでjava 1.6を使用して実行しようとすると、例外が発生し始めます。
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はcommons-logging-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
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 ...)
はい、commons-loggingには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
これは私を困惑させました、そして私が今1日以上バグを犯した同僚は誰でも。答えをまとめるために、少なくとも今のところ、これに対するサードパーティのソリューションは、ライセンスの制限と会社のポリシー(例:exeファイルの作成やjarファイルのパッケージ化のためのツール)が原因である可能性があります。最終的な目標は、開発WindowsボックスからLinuxサーバー(依存するjarを含む)にコピーしてデータベースにデータを取り込むために使用できるjarを作成することです(したがって、クラスパスは開発環境とデプロイメント環境で異なる場合があります)。この謎への手がかりは大歓迎です!