我有一个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我做错了什么?
感谢阅读!
答案 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并捆绑各个类。