我试图将Log4j添加到Ant中创建可执行JAR的项目类路径中,但似乎没有正确添加。
这是我的Ant构建脚本的path
组件:
<path id="classpath.compile">
<fileset dir="${dir.myLibs}">
<include name="**/*.jar"/>
</fileset>
<pathelement location="${dir.webContent}/WEB-INF/lib/log4j.jar" />
</path>
编译目标如下:
<target name="-compile">
<javac destdir="${dir.binaries}" source="1.6" target="1.6" debug="true" includeantruntime="false">
<src path="${dir.source}"/>
<classpath refid="classpath.compile"/>
</javac>
</target>
创建JAR的目标:
<target name="-createJar" >
<jar jarfile="${path.jarFile}"
manifest="${dir.source}META-INFMANIFEST.MF">
<fileset dir="${dir.binaries}" casesensitive="yes">
<exclude name="**/*.java"/>
</fileset>
</jar>
</target>
最后,MANIFEST。MF:
Manifest-Version: 1.0
Class-Path: ../../../WebContent/WEB-INF/lib/log4j.jar (what is this pathing relative to?)
Main-Class: foo.Bar
创建了JAR,但是当我执行它时,我得到:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger...
你知道我做错了什么吗?
从MANIFEST中的类路径来看,您正在尝试引用jar中的jar。要做到这一点,目前只有两种方法:1)使用一个特殊的类加载器,就像前面提到的@infosec812,或者2)将jar依赖项直接分解到jar的根目录中。两者都是可行的,但我没有看到它们在你的ant脚本中发生。
如果你试图在你的jar之外引用一个jar,你的相对类路径是相对于你正在执行的jar的位置的。确保所引用的jar存在于该位置。
我猜您正在按如下方式运行Java程序
java -jar myapp.jar
在这种情况下,您需要在清单中指定Class-Path属性。我建议您也检查manifestclasspath任务
创建jar时不包括jar中链接的库。为了以这种方式运行它,您必须在执行类路径中拥有所需的jar。或者,您可以使用我使用的解决方案,即创建一个只有一个jar的归档文件。它将应用程序的专用类装入器添加到生成的jar中,并将所需的jar打包到最终的可执行jar中。