快速业务通道

ant构建工具的类装载器问题 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
cast.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:\project\classes;f:\project;

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

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

这个实验再次说明CLASSPATH环境变量对ant起了作用,将AuxiliaryClass.class放在了classpath环境变量指定的另外一个目录中,也可以被ant工具的java任务装载。

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

时间:2010-12-31

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命令,其中第一个参数为要加载的类,第二个参数为到哪个目录中去加载如类。

ant -Darg0=cn.itcast.AuxiliaryClass -Darg1=cn\itcast

命令执行的结果为:

cn.itcast.MainClass sun.misc.Launcher$AppClassLoader sun.misc.Launcher$ExtClassLoader

从第一行打印的内容上可以看到:AuxiliaryClass类的类装载器为MainClass。这个结果与我的预期不同,因为按照类加载器的委托机制,MailClass类加载器将先委托其父级类装载器AppClassLoader加载AuxiliaryClass,而AuxiliaryClass所在的目录f:\project已经在第6步中加入到了Classpath环境变量当中,AppClassLoader可以成功加载AuxiliaryClass,所以,第一行打印出来的类装载器应该是AppClassLoader。为了印证我的想法,我改用java.exe来执行上面的程序:

java cn.itcast.MainClass cn.itcast.AuxiliaryClass cn\itcast

执行结果如下:

sun.misc.Launcher$AppClassLoader sun.misc.Launcher$ExtClassLoader

可见,使用java.exe执行上面的程序时,AuxiliaryClass类的类装载器确实是MailClass类加载器的父级类加

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号