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

时间:2011-07-21 21:54:38

标签: java ant jar log4j

我正在尝试将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-INF\MANIFEST.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...

关于我做错了什么的想法?

3 个答案:

答案 0 :(得分:1)

我猜你正在运行Java程序,如下所示

java -jar myapp.jar

在这种情况下,您需要在清单中指定Class-Path属性。我建议您查看 manifestclasspath 任务

答案 1 :(得分:1)

创建jar不包括jar中的链接库。您必须在执行类路径中拥有所需的jar才能以这种方式运行它。或者,您可以使用我使用的解决方案,即创建one-jar存档。它为您的应用程序添加了一个专门的类加载器到生成的jar中,并将所需的jar包装到最终的可执行jar中。它非常适合部署简洁易用的软件包。

答案 2 :(得分:1)

从您的MANIFEST中的类路径看,您正在尝试引用jar中的jar。使AFAIK工作的唯一两种方法是1)一个特殊的类加载器,如@ infosec812提到,或2)通过将jar依赖项直接爆炸到jar的根目录。要么是可行的,但我没有看到它们中的任何一个发生在你的蚂蚁脚本中。

如果您尝试引用jar外部的jar,则相对类路径相对于正在执行的jar的位置。确保引用的jar存在于该位置。