2013-03-13 62 views
0

我正在实现一个ant任务作为另一个类的包装器,它使用系统类加载器加载其他几个类。现在,任务就是在这些其他类的罐子一样,所以我不知道它为什么不找他们,因为运行

请注意,我的类都在$CLASSPATH环境变量的任务。会不会发生的问题,如果我export LOCALCLASSPATH=$CLASSPATH

小例子:

<taskdef name="mytask" classname="my.package.MyTask" /> 

<target name="compile"> 
    <mytask /> 
</target> 

,你可以很容易地看到这里的问题

public class MyTask extends Task { 
    public void execute() throws BuildException { 
    try { 
     ClassLoader cl = ClassLoader.getSystemClassLoader(); 

     // this will only print the ant jar file path 
     for(URL url: ((URLClassLoader)cl).getURLs()){ 
     log(url.getFile()); 
     } 

     cl.loadClass("my.package.OtherClass"); // throws an exception 

    } catch (Exception ex) { 
     throw new BuildException(ex); 
    } 
    } 

} 
+0

你的问题与'委托类加载器'有关:http://ant.apache.org/faq.html#delegating-classloader – Jayan 2013-03-13 11:16:04

+0

据我所知,没有 – 2013-03-13 11:28:43

+0

Hm,LOCALCLASSPATH从CLASSPATH中复制了VALIES。请添加ant版本,操作系统版本到您的问题。它可以帮助某个人。 – Jayan 2013-03-13 16:40:00

回答

0

ant shell脚本内部返工类路径,所以SystemClassLoader只包含“真实”类路径的最小部分

tl; dr:使用

ClassLoader cl = Thread.currentThread().getContextClassLoader(); 

,而不是

ClassLoader cl = ClassLoader.getSystemClassLoader(); 

从邮件列表,Rainer Noack

如果你推出通过shell脚本的蚂蚁,它使用 oata.launcher.Launcher.java

这个类有点重新组织类路径。 env变量CLASSPATH 和classpath命令行参数被剥离并替换为用于启动ant的最小类路径 。系统类加载器 的子类加载器是使用原始CLASSPATH条目创建的。 oata.Project然后加载这个类加载器。

的问题是,在ClassLoader.getSystemClassLoader()装载机实际上不变,所述一种改变(即,荣誉$ CLASSPATH,-lib等的一个)可使用Thread.currentThread().getContextClassLoader()检索。