Log4j没有被添加到Ant的类路径中



我试图将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中。

最新更新