我運行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庫。建議?
默認的Java類加載策略 - PARENT FIRST--幾乎被所有寫過的Java類所烘焙。這些類已經在該策略下進行了測試和嘗試。然而,不能保證他們會在任何其他類加載策略下工作。 切換到父類最後一類加載策略幾乎總是會讓你後悔,有時甚至是在開發幾個月後纔會感到遺憾。最後使用父母 - 儘管它可能解決您當前的問題 - 很可能不是您想要的。 – 2009-05-06 18:05:54
@Steven Devijver我還沒有遇到過這樣的問題,並且它是讓某些應用程序在JEE類型環境中工作的唯一方法。這也是確保您使用您認爲自己的依賴類的版本的唯一方法。服務器類路徑中總是存在類(特別是對於xml解析),這些類很容易干擾您自己的應用程序的獨立性。在這種情況下,你認爲什麼會失敗?類將繼續得到解決,並且使用與應用程序綁定的版本而不是其他地方定義的版本。 – Robin 2009-05-07 12:58:21