今天学习log4j的时候,用控制台运行程序挺好的,心想,用ant运行下会如何呢,紧接着问题就来……
程序如下:
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class Log4jTest
{
public static void main(String args[])
{
BasicConfigurator.configure();
Logger log = Logger.getLogger(Log4jTest.class.getName());
log.setLevel(Level.INFO);
log.info("done!");
log.warn("warn");
}
}
在JAVA控制台运行一切正常,转用ant运行就出问题了!
xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="Test" default="run">
<target name="init">
<mkdir dir="Classess" />
<echo message="just for test!" />
</target>
<target name="compile" depends="init">
<javac srcdir="." destdir="Classess" includes="Log4jTest.java" />
</target>
<target name="run" depends="compile">
<java classname="Log4jTest" classpath="Classess" />
</target>
</project>
运行结果如下:
Buildfile: C:/workspace/Test/build.xml
init:
[echo] just for test!
compile:
run:
[java] java.lang.NoClassDefFoundError: org/apache/log4j/BasicConfigurator
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:180)
[java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:710)
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:178)
[java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:84)
[java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[java] at org.apache.tools.ant.Task.perform(Task.java:364)
[java] at org.apache.tools.ant.Target.execute(Target.java:341)
[java] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[java] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[java] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[java] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[java] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[java] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[java] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[java] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[java] Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/BasicConfigurator
[java] at Log4jTest.main(Unknown Source)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:585)
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.run(ExecuteJava.java:202)
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:134)
[java] ... 14 more
[java] --- Nested Exception ---
[java] java.lang.NoClassDefFoundError: org/apache/log4j/BasicConfigurator
[java] at Log4jTest.main(Unknown Source)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:585)
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.run(ExecuteJava.java:202)
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:134)
[java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:710)
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:178)
[java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:84)
[java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[java] at org.apache.tools.ant.Task.perform(Task.java:364)
[java] at org.apache.tools.ant.Target.execute(Target.java:341)
[java] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[java] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[java] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[java] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[java] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[java] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[java] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[java] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
BUILD SUCCESSFUL
Total time: 1 second
看到上边的错误,我的第一反映是CLASSPATH没有设置log4j的jar包,但当我把CLASSPATH设置好后,依然出现上边错误!左思右想,没想出问题的原因。难道是必须在xml文件里把jar包的路径加进去?试试!
xml文件修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="Test" default="run">
<target name="init">
<mkdir dir="Classess" />
<echo message="just for test!" />
</target>
<target name="compile" depends="init">
<javac srcdir="." destdir="Classess" includes="Log4jTest.java" >
<classpath>
< pathelement location="C:/logging-log4j-1.2.13/logging-log4j-1.2.13/dist/lib/log4j-1.2.13.jar"/>
</classpath>
</javac>
</target>
<target name="run" depends="compile">
<java classname="Log4jTest" classpath="Classess" >
<classpath>
<pathelement location="C:/logging-log4j-1.2.13/logging-log4j-1.2.13/dist/lib/log4j-1.2.13.jar"/>
<pathelement location="Classess" />
</classpath>
</java>
</target>
</project>
运行成功!
总结:Apache这样做还是有它的理由的,为了便于程序的移植性,也就是为了让别人也能看懂运行你的程序,你必须把jar包的路径写出来,这样别人通过路径名也能看出这个jar包的信息,如果你设置在CLASSPATH里的话,这些信息对于别的用户来说是不透明的,不利于程序的移植!谢谢方老大的指导:)