2011-12-28 156 views
2

我已經問過一個相關的問題 - 但這不完全相同。如果問題有點不同,我早先被告知不要在同一主題中提出其他問題。所以我發佈這個新問題。請讓我知道如果我不應該。Classloader Filtering

我有一個網絡應用程序(戰爭文件)。 Jar與apache-commons-lang相關聯,與其他jar文件一起被添加到WEB-INF庫中。然而,與apache-commons-lang有關的舊版本的jar也存在於系統庫中,並且在系統classpath中部署jar文件時優先,並且我得到「classnotfound」錯誤。必須爲在WEB-INF中指定的類指定prefer-web-inf-classes,使其優先於System Classloader中的類。不過,我只希望這個特定的jar優先於系統類加載器。當我發佈類似的問題時,建議我在weblogic中使用「篩選類加載器」。當我有耳朵時,該解決方案效果很好。但是我不能在war文件中添加weblogic-application.xml,我無法使用這個classloader過濾概念。有出路嗎?謝謝。

+0

如果無法通過配置來完成,是否有可能編寫一些代碼來實現這一點?謝謝! – 2011-12-29 09:06:04

回答

1

我對WebLogic不是很熟悉,但是如果您知道如何使用新的jar,並且進入該代碼就像實例化一個類並執行一種啓動方法一樣簡單,那麼您可能會失去定製類加載器? 請參閱http://tshrestha.blogspot.com/2011/12/using-custom-classloader.html

但我承認,某些WebLogic專家知道如何通過WebLogic自身的某些配置來實現此目的。

0

我的一位同事指出,在weblogic.xml中指定相關的包可以解決問題。但要嘗試一下。

<wls:prefer-application-packages> 
     <wls:package-name>javax.faces.*</wls:package-name> 
     <wls:package-name>com.sun.faces.*</wls:package-name> 
     <wls:package-name>javax.xml.*</wls:package-name> 
     <wls:package-name>org.apache.xerces.*</wls:package-name> 
     <wls:package-name>antlr.*</wls:package-name> 
     <wls:package-name>org.apache.log4j.*</wls:package-name> 
     <wls:package-name>org.apache.commons.*</wls:package-name> 
    </wls:prefer-application-packages> 
0

我沒有weblogic的大師,但我看到兩種方式(有沒有試過,但只是猜測)

1)只保留 '喜歡-WEB-INF類' 需要的jar在WEB-INF並將其餘的移動到不同的位置並將它們指向MANIFEST.MF的戰爭

2)將空白耳朵中的戰爭捆綁起來,並指定耳朵的MANIFEST.MF中的所有罐子並在weblogic-application中指定首選項類.xml。這個想法是使同一個應用程序的戰爭和耳朵的一部分,使網絡應用程序可以使用相同的類加載器(而不是使用'prefer-web-inf-classes')

編輯: 對於第一點我有驗證了weblogic忽略了war文件的Manifest文件。所以第一個溶膠不起作用。關於第二個解決方案,如果耳中沒有ejbs,weblogic會盲目忽略耳朵的清單。因此,您必須將WAR的庫移到APP-INF \ lib或簡單的lib目錄,並在weblogic-application.xml中指定首選項包apache-commons-lang 反正不認爲這是一個efficeint解決方案(esp when你不想爲了它而創造一個耳朵)

0

維基,我有同樣的問題,因爲你的。對我而言,解決方案是在域下創建一個/lib文件夾(其中一些位於weblogic文檔中),添加您需要覆蓋的任何第三方JAR,然後在PRE_CLASSPATH變量中指定該庫startWeblogic.cmd文件。

在我的情況下,weblogic有一箇舊版本的commons-lang,這是導致衝突。 因爲我沒有EAR部署,所以weblogic-application.xml解決方案是不行的。 當我將下列內容添加到我的pre_classpath -
set PRE_CLASSPATH =%PRE_CLASSPATH%;%DOMAIN_HOME%/ lib/commons-lang-2.5.jar;

我的問題已解決。

+1

感謝Daranha,這是我們使用的解決方案之一。但是我們不想在pre_classpath變量中定義它,因爲它適用於顯示在weblogic應用服務器中的所有應用程序。 – 2012-05-26 20:14:22