ClassLoader与Ant的一些问题

今天被这个Classloader搞死了。起因是这样的:
public  static void  staticMethod(){
String resource = ClassLoader.getSystemResource(“a.xml”).toString();
}
然后a.xml已经加入了CLASSPATH。
整个代码是写在一个Ant的Task里,然后Ant里调用(事先<taskdef>)
这个时候在Eclipse调用build.xml,没有问题。
但是在命令行下调用ant,出错,找不到,返回null。
于是到Task里的execute里测试一下
public void execute(){
String resource = getClass().getClassLoader().getResource(“a.xml”).toString();
}
两个环境都找到了。
看来是static的函数里ClassLoader比较不一样,是systemClassLoader估计。
然后这么写:
public  static void  staticMethod(){
String resource = new Object().getClass().getClassLoader().getResource(“a.xml”).toString();
}
居然报出一个NullPointerException,原来是返回的ClassLoader为空。马上查了一下ClassLoader的源码(IBM JDK),发现如果某个instance的classloader=systemClassLoader就返回空。什么道理啊。。。
这么写,也不行
public static void staticMethod(){
String resource = ClassLoader.getSystemClassLoader().getResource(“a.xml”).toString();
}
这么写,还是不行
public static void staticMethod(){
String resource = ClassLoader.getSystemClassLoader().getParent().getResource(“a.xml”).toString();
}
嗯,把那个类换成Singleton,发现居然可以了。
后来发现要这么写:
public class Test{
public static void staticMethod(){
String resource = new Test().getClass().getClassLoader().getResource(“a.xml”).toString();
}
}
才OK。。。
Eclipse自已有ClassLoader,Ant自己又有ClassLoader。才有这么多问题。
接下来我想搞的OSGi,每个Bundle都有自己的classloader实例。。。。晕死了。。。

Leave a Reply

Your email address will not be published.