2009-05-06 53 views
3

我運行iPlanet的Java應用程序服務器,它正在加載commons-logging-1.0.4.jar我該如何解決這個無效的類加載器層次結構?

這很好,直到我的一個應用程序調用AuthSSLProtocolSocketFactory這是另一個也使用commons-logging的apache庫。

我把JVM類路徑的jar和得到這個錯誤:

Invalid class loader hierarchy. You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed. (Caused by org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy....

看來,commons-logger不喜歡有不同的類加載器加載的本身兩個實例。我假設應用程序服務器有它自己的類加載器,它第一次加載它(雖然我找不到任何提及它的應用服務器配置),所以當我的應用程序第二次加載它時會拋出異常。

我無法更改Web服務器,我無法更改apache庫。建議?

回答

0

你是否明確地將公共日誌記錄到類路徑中?你說jvm classpath,所以我假設你在啓動iPlanet時在命令行中指定它。這不是在J2EE應用程序中加載jar的推薦方式。

最簡單的事情就是讓Apache庫使用iPlanet附帶的commons logging jar。不要將commons-logging.jar放在WEB-INF/lib目錄或任何類路徑設置中,並且應該自動拾取iPlanet。

0

不熟悉iplanet,但在WebSphere中,您可以將應用程序類加載策略設置爲PARENT_LAST。這會在查看父級之前在應用程序類加載器中加載所有內容。這應該可以解決這種問題,假設你有類似的設置。

這確實意味着您將不得不在您自己的應用程序中提供所有依賴關係(無論如何,這是最佳實踐)。

+0

默認的Java類加載策略 - PARENT FIRST--幾乎被所有寫過的Java類所烘焙。這些類已經在該策略下進行了測試和嘗試。然而,不能保證他們會在任何其他類加載策略下工作。 切換到父類最後一類加載策略幾乎總是會讓你後悔,有時甚至是在開發幾個月後纔會感到遺憾。最後使用父母 - 儘管它可能解決您當前的問題 - 很可能不是您想要的。 – 2009-05-06 18:05:54

+1

@Steven Devijver我還沒有遇到過這樣的問題,並且它是讓某些應用程序在JEE類型環境中工作的唯一方法。這也是確保您使用您認爲自己的依賴類的版本的唯一方法。服務器類路徑中總是存在類(特別是對於xml解析),這些類很容易干擾您自己的應用程序的獨立性。在這種情況下,你認爲什麼會失敗?類將繼續得到解決,並且使用與應用程序綁定的版本而不是其他地方定義的版本。 – Robin 2009-05-07 12:58:21