当Thread.currentThread().getContextClassLoader()返回null时,发生了什么?

4
从一个包含在/META-INF中的JAX-WS SPI文本文件和指向它的类的JAR文件开始。将其放入类路径中。将当前线程的contextClassLoader设置为null。
从JDK 1.6中的JAX-WS API调用Service类,并开始逐步执行它。在没有上下文类加载器的情况下,此代码将调用Class的静态方法来查找内容。
它将成功找到SPI文件。但是它不会找到它所命名的.class文件。
如果您真的想自己尝试,请获取Apache CXF 2.2.10,将其放入类路径中,并将上下文类加载器设置为null。
这不是毫无意义的折磨练习:事实证明,当Open Office调用Java扩展('UNO')时,它会将上下文类加载器设置为null。需要进行一些重要的考古工作才能弄清楚这一点。这让我想知道,是否有JDK bug可以解释不一致的结果,或者我没有理解的某些指定行为?

1
看起来它正在使用系统类加载器(包括类路径类)来加载服务文件,但是使用引导类加载器来加载类。grep -R Class.forName . | grep FactoryFinder 大致上平均分配了选择哪个(你难道不喜欢克隆和拥有代码吗?)。当然,如果相同的代码不是从系统、扩展或引导加载器中加载,则甚至无法找到自己。 - Tom Hawtin - tackline
@Tom,能够把责任推给别人确实让人感到安慰。你愿意把这转化为一个答案,这样我就可以接受它了吗? - bmargulies
@irr 问题是,为什么类加载结果不一致。答案是:因为包含在JRE中的参考JAX-WS实现会进行不一致的类加载调用。 - bmargulies
1个回答

1

当然可以。但是当它为空时,这是他们的JAX-WS代码出现故障。 - bmargulies
耸肩。事情发生了。针对JAX-WS提出一个错误报告。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接