是否有一個標準的方式(即,通過一些Java/J2EE /等規範中定義),以提供一個自定義的類加載器將Java Servlet容器應用來加載WAR文件?爲WAR文件強制自定義ClassLoader?
上,我們正在展開一個大型商業Java軟件包(美孚)與Web服務需要部署一定的靈活性(作爲單獨的服務等)的新項目。特別是,我們希望避免在每個WAR文件中包含所有Foo軟件依賴性Jar文件,因爲它們很多,很大,並且隨着我們的開發,將會隨補丁/錯誤修復版本發生變化。同樣,不得不將所有依賴複製到每個Servlet容器的「lib」目錄中。
理想情況下,我想告訴大家,這些WAR文件必須使用自定義的類裝載器,我將提供自動包括富軟件的依賴罐子裝的Java應用服務器。像這樣的東西(在Java的僞代碼):
public class MyWarFileClassLoader extends ClassLoader {
protected URLClassLoader urlcl;
public MyWarFileClassLoader(File warFile) {
File installDir = System.getEnv("FOO_HOME");
List<File> fooEntries = new File(installDir, "jars").listFiles("*.jar");
fooEntries.add(new File(installDir, "resources"));
fooEntries.add(warFile);
this.urlcl = new URLClassLoader(fooEntries);
}
public Class<?> findClass(String name) {
return this.urlcl.findClass(name);
}
}
如果沒有做到這一點沒有標準方式,有一個簡單的方法來達到幾個WAR文件相同的目標,不管目標servlet容器?
[編輯]
換一種方式:有允許WAR文件在運行時管理它們自己的依賴,而不是依賴於Servlet容器配置的通用模式?當然,我可以讓WAR文件清單包含Class-Path
屬性,但是這些條目在構建時仍然是「硬編碼」的,而不是在運行時自動檢測到的。
感謝這個信息,Vineet,非常有趣。我會細化我的問題,特別提到Servlet容器,因爲我們不需要完整的AppServer。 – maerics
@maerics,我的答案將繼續保持不變,除了您可能依賴JAR清單中的'Extension-List'屬性來允許加載共享庫(它仍將安裝在服務器中適用於每個服務器的方式)。您可能需要閱讀Java EE 6規範中有關庫支持(第8.2節)的整個部分。 –