使用ant build创建的jar的NoClassDefFound错误

时间:2011-11-26 06:27:10

标签: java ant build jar

我有一个java项目,类包含com.nik.mypackage包中的main方法。只引用了一个库,即someLib-5.0.2.jar

这个库位于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>

正在创建jar MyProject-20111126.jar。但是,运行以下命令:

c:>java -jar MyProject-20111126.jar

为someLib.jar

中的类抛出NoClassDefFoundError

我做错了什么?

感谢阅读!

2 个答案:

答案 0 :(得分:1)

当您运行相对于MyProject-20111126.jar的someLib.jar时?

您在MyProject.jar中设置的类路径告诉VM在MyProject.jar的父目录中查找lib文件夹。

清单中的ClassPath条目是相对于JAR文件的位置进行解释的。它用于在文件系统上查找jar文件。 JAVA中的常规类加载器不支持JAR文件中捆绑的JAR文件。

答案 1 :(得分:0)

正如Eric Rosenberg的评论中提到的,我们无法将jar文件嵌套在其他jar文件中。因此,我们需要对应用程序jar中的库进行deflat并捆绑各个类。