ant构建工具的类装载器问题
http://tech.ddvip.com 2006年11月20日 社区交流
本文详细介绍ant构建工具的类装载器问题
再次执行ant,将报告如下错误信息:
Could not find cn.itcast.Auxiliary. Make sure you have it in your classpath
at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:170)在执行ant的命令行窗口中设置classpath环境变量,将编译后生成的AuxiliaryClass.class类所在的目录也加入进CLASSPATH环境变量中:
set CLASSPATH=f:projectclasses;f:project;再次执行ant,执行结果正常,如下:
java.net.URLClassLoader
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
cn.itcast.AuxiliaryClass这个实验再次说明CLASSPATH环境变量对ant起了作用,将AuxiliaryClass.class放在了classpath环境变量指定的另外一个目录中,也可以被ant工具的java任务装载。
7.修改MainClass.java文件,让其扩展成一个类装载器,专门负责从一个特定的目录中去加载类。MainClass同时也作为一个启动运行类,在其main方法中通过MainClass这个类装载器加载AuxiliaryClass类。
源程序:MainClass.java
package cn.itcast;
import java.io.*;
public class MainClass extends ClassLoader
{
private String path = null;
public MainClass(String path)
{
//错误检查省略
this.path = path;
}
protected Class findClass(String name) throws ClassNotFoundException
{
try
{
File f = new File(path,name.substring(name.lastIndexOf('.')+1) + ".class");
FileInputStream fis = new FileInputStream(f);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int b = 0;
while((b=fis.read()) != -1)
{
bos.write(b);
}
byte [] buf = bos.toByteArray();
fis.close();
bos.close();
return defineClass(name,buf,0,buf.length);
}catch(Exception e)
{
throw new ClassNotFoundException(name + "is not found!");
}
}
public static void main(String [] args) throws Exception
{
Class cls = new MainClass(args[1]).loadClass(args[0]);
ClassLoader loader = cls.getClassLoader();
//打印出的动态加载的AuxiliaryClass的类装载器,及该类装载器的各级父类装载器
while(loader != null)
{
System.out.println(loader.getClass().getName());
loader = loader.getParent();
}
}
}按如下方式执行ant命令,其中第一个参数为要加载的类,第二个参数为到哪个目录中去加载如类。
来源:csdn 责编:豆豆技术应用
正在加载评论...