Apache想的就是周全,赞一个……

今天学习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里的话,这些信息对于别的用户来说是不透明的,不利于程序的移植!谢谢方老大的指导:)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值