2010-09-19 64 views
4

從包含/ META-INF中的JAX-WS SPI文本文件的JAR文件開始,然後指向它所指向的類。把它放到classpath中。將當前線程的contextClassLoader設置爲null。當Thread.currentThread()。getContextClassLoader()返回null時,發生了什麼?

從JDK 1.6中的JAX-WS API調用Service類,並開始逐步完成。在沒有上下文類加載器的情況下,此代碼將調用Class的靜態方法來查找事物。

它會成功找到SPI文件。但它不會找到它命名的.class。

如果你真的想爲自己嘗試一下,請抓住Apache CXF 2.2.10,將它放在類路徑中,並清除上下文類加載器。

這不是毫無意義的受虐狂行爲:當Open Office調用Java擴展('UNO')時,它會離開上下文類加載器null。它考慮了一些重要的考古學方面的知識。這讓我想知道,是否有解決不一致結果的JDK錯誤,或者我不明白的某些特定行爲?

+1

看起來像使用系統類加載器(包括類路徑類)來加載服務文件,但引導類加載器加載類。 'grep -R Class.forName。 | grep FactoryFinder'幾乎可以平均分配到哪個選項上(你不只是<3克隆和自己的代碼?)。當然,如果相同的代碼是從系統,擴展或引導加載程序以外的任何其他代碼加載的,那麼它甚至無法找到它自己。 – 2010-09-19 22:13:18

+0

@Tom,好吧,能夠把這個責任歸咎於別人是令人欣慰的。請注意將其作爲答案,以便我可以接受它? – bmargulies 2010-09-19 23:13:09

+0

有什麼問題? – irreputable 2010-09-20 00:37:32

回答

1

這種事情引發了各種各樣的錯誤;例如掃描this query的結果。 Sun的一般迴應是這些功能不是bug,不會被修復;例如http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4155645

底線是getContextClassLoader可以返回null

+0

當然。但是它的JAX-WS代碼在空時發生故障。 – bmargulies 2010-09-20 13:52:44

+0

聳聳肩。東西發生。針對JAX-WS提出錯誤報告。 – 2010-09-20 14:17:20

相關問題