2011-11-26 85 views
1

我有一個包含com.nik.mypackage包中的main方法的java項目。只有一個庫被引用,它是someLib-5.0.2.jar使用ant build創建的jar的NoClassDefFound錯誤

這個庫位於eclipse的lib文件夾中,並被添加到構建路徑中。

我使用的是下面的ant腳本目標創建應用程序的可執行的JAR:

<property name="src" location="src"/> 
<property name="build" location="build"/> 
<property name="dist" location="dist"/> 

    <target name="init"> 
     <tstamp/> 
     <mkdir dir="${build}"/> 
    </target> 


<target name="compile" depends="init" 
    description="compile the source " > 
     <javac srcdir="${src}" destdir="${build}"> 
     <classpath> 
     <pathelement path="${classpath}"/> 
       <pathelement location="lib/someLib-5.0.2.jar"/> 
     </classpath> 
     </javac> 
    </target> 

<target name="dist" depends="compile" description="generate the distribution" > 
    <!-- Create the distribution directory --> 
    <mkdir dir="${dist}/lib"/> 
<copy todir="${build}/lib" verbose="true" file="lib/someLib-5.0.2.jar" /> 

     <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> 
     <jar jarfile="${dist}/lib/myProject-${DSTAMP}.jar" basedir="${build}"> 

     <manifest> 
      <attribute name="Main-Class" value="com.nik.mypackage.MainClass"/> 
      <attribute name="Class-Path" value="../lib/someLib.jar"/> 
     </manifest> 
</jar> 
</target> 

罐子MyProject的-20111126.jar是越來越創建。但是,運行下面的命令:

c:>java -jar MyProject-20111126.jar 

拋出一個NoClassDefFoundError的一類someLib.jar

我在做什麼錯?

感謝您的閱讀!

回答

0

正如Eric Rosenberg在評論中提到的,我們不能將jar文件嵌入其他jar文件中。所以我們需要壓縮庫並捆綁應用程序jar中的單個類。

1

當你運行whereLib.jar相對於MyProject-20111126.jar?

您在MyProject.jar中設置的類路徑告訴VM在MyProject.jar的父目錄中查找lib文件夾。

清單中的ClassPath條目將相對於JAR文件的位置進行解釋。它用於在文件系統上查找jar文件。 JAVA中的常規類加載器不支持JAR文件中捆綁的JAR文件。

+0

- 我在jar中複製lib本身...因此如果您嘗試查看jar內部,則會在META-INF文件夾和MainClass包結構中創建一個lib文件夾。 lib文件夾包含somelib jar – Nik

+2

您不能在其他jar文件中嵌入jar文件。您需要展開庫jar並將其類包裝到應用程序jar中,或者需要在文件系統上有jar,並相應地在manifest中設置相對路徑。 –