ant构建工具的类装载器问题

http://tech.ddvip.com   2006年11月20日    社区交流

本文详细介绍ant构建工具的类装载器问题

<target name="run" depends="compile">
<java classname="cn.itcast.MyClassLoader">
<!--classpath>
<pathelement location="${classes.dir}"/>
</classpath-->
</java>
</target>

  再次执行ant,将报告如下错误信息:

Could not find cn.itcast.MainClass. Make sure you have it in your classpath
at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:170)

  在执行ant的命令行窗口中设置classpath环境变量:

set CLASSPATH=f:projectclasses;

  再次执行ant,执行结果正常,如下:

java.net.URLClassLoader
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
cn.itcast.AuxiliaryClass

  这个实验说明CLASSPATH环境变量对ant起了作用,并且在这种情况下,类的加载入器不再是 org.apache.tools.ant.loader.AntClassLoader2,而是java.net.URLClassLoader。

  6.修改build.xml文件,让ant生成的AuxiliaryClass.class文件与MainClass文件位于不同的目录中,即结果目录如下:

f:project
|__src
| |__cn
| |__itcast
| |__MainClass.java
| |__AuxiliaryClass.java
|__build.xml
|__classes
| |__cn
| |__itcast
| |__MainClass.class
|__cn
|__itcast
|__AuxiliaryClass.class

  修改后的build.xml文件内容如下:

<project name="antloader" default="run">
<property name="classes.dir" value="classes" />
<property name="src.dir" value="src" />
<property name="mainclass" value="cn.itcast.MainClass" />
<target name="init">
<mkdir dir="${classes.dir}" />
</target>
<target name="compile" depends="init">
<javac destdir="${classes.dir}" >
<src path="${src.dir}" />
<include name="cn/itcast/MainClass.java" />
</javac>
<delete file="${classes.dir}/cn/itcast/AuxiliaryClass.class" />
<javac destdir="." >
<src path="${src.dir}" />
<include name="cn/itcast/AuxiliaryClass.java" />
</javac>
</target>
<target name="run" depends="clean,compile">
<java classname="${mainclass}">
<!--classpath>
<pathelement location="${classes.dir}"/>
</classpath-->
<arg line="${arg0} ${arg1}" />
</java>
</target>
<target name="clean">
<delete dir="${classes.dir}" />
</target>
</project>

  因为第一个javac任务编译MainClass.java时,也会编译它引用的AuxiliaryClass.java文件,所以,增加了delete任务删除掉生成的AuxiliaryClass.class文件,然后再使用一个javac任务将AuxiliaryClass.java编译到另外一个目录中。java任务中也增加了一个<arg>子元素,用于为java虚拟机传递参数,在这一步暂时不需要这个元素,在下一步的实验中将使用这个元素。

来源:csdn    责编:豆豆技术应用

正在加载评论...