Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Ant使用log4j运行任务时出现问题_Java_Ant_Log4j - Fatal编程技术网

Java 使用Ant使用log4j运行任务时出现问题

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

我的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

[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设置类路径,以便在代码引用第三方类时加载类定义。