Java 使用Ant使用log4j运行任务时出现问题
我的java应用程序使用log4j进行日志记录。使用ant,项目构建成功,但我无法运行它。我得到的错误是Java 使用Ant使用log4j运行任务时出现问题,java,ant,log4j,Java,Ant,Log4j,我的java应用程序使用log4j进行日志记录。使用ant,项目构建成功,但我无法运行它。我得到的错误是 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/Log ......... Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log 我的类路径包含log4jjar [ech
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/Log
.........
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log
我的类路径包含log4jjar
[echo] ..../apache-log4j-1.2.15/log4j-1.2.15.jar: .....
我的ant版本是1.7.1。我错过了什么
[Edit]我的应用程序正在引用另一个需要commons日志jar的项目。因此,我尝试创建一个引用项目的可执行jar,以便所有依赖项都被继承。创建可执行jar的ant任务如下所示:
<target name="executablejar" depends="compile">
<delete file="${dist}/app.jar" />
<javac debug="true" srcdir="${src}" destdir="${classes}" classpath="${javac.classpath}"/>
<copy todir="classes" flatten="true">
<path>
<pathelement path="${javac.classpath}"/>
</path>
</copy>
<jar jarfile="${dist}/app.jar" basedir="${classes}" />
</target>
但是,错误仍然存在。我是否正确地创建了可执行jar?您必须添加到类路径中。包
org.apache.commons.logging
不是log4j的一部分。您可能无意中从org.apache.commons.logging
导入了一个类,现在,正如您所料,JVM希望在运行时在类路径上找到类定义
我建议您在代码中查找commons日志包的用法。@athena您说您创建了一个支持项目的jar,但这并没有捆绑并带来该项目的依赖项(这些称为传递依赖项)。如果您的另一个项目使用Commons Logging,而您又必须使用这个支持项目,那么在执行时,您需要在类路径上有Commons Logging jar。@RonU:我认为创建一个可执行jar会捆绑所有依赖项。那么,有没有一种方法可以捆绑所有依赖项并创建jar?@athena可执行jar实际上只是意味着清单中有一个主类条目,这意味着您可以调用jar而无需指定启动类。传统上,J2SE应用程序发行版是一个包含您开发的应用程序jar的存档(如zip)和一个支持库文件夹,其中包含应用程序所依赖的jar。通常还有一个脚本来启动和设置类路径。然而,罐子本身实际上不能嵌套其他罐子。@RonU:谢谢你的澄清。你能给我一些建议来帮助创建这样一个脚本吗?这比在ant的类路径中包含项目jar及其所有依赖项(jar)更好吗?让我们对编译时类路径和运行时类路径进行重要区分。在编译时,您正在使用Ant进行构建,并且您已经告诉它需要编译哪些JAR。在运行时,通过某种方式(比如脚本),您必须为调用JVM设置类路径,以便在代码引用第三方类时加载类定义。