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    责编:豆豆技术应用

正在加载评论...