2012-04-10 49 views
2

我想寫一個'應用服務器',它可以部署像Tomcat這樣的應用程序。部署應用程序時,我創建了一個定製的ClassLoader實例,並使用它來加載應用程序文件夾中的類和資源。關於ClassLoader還有很多需要了解的知識,我仍然對此感到困惑。如何從多個ClassLoader中的不同位置加載具有相同名稱的資源?

我的問題是:是否有不同的'類路徑'爲不同的ClassLoader實例?或者這些ClassLoader實例是否從同一位置尋找資源?

例如,'app1'的資源位於apps/app1/classes/log4j.properties,'app2'也有一個位於apps/app2/classes/log4j.properties,如何使app1的ClassLoader以正確的路徑讀取它?

回答

0

這是爲了在您的自定義ClassLoader中實現。

假設您從擴展URLClassLoader開始。

當你解壓/部署你的'應用程序'時,你必須在你的類加載器上調用void addURL(URL url),其中追加指定的URL到URL列表來搜索類和資源。

一個過程可能是這樣的

  • 讓你作爲一個zip /戰爭
  • 解壓應用程序目錄中的
  • 讓你解壓的資源(JAR,子目錄的列表,等等)。你可以在你爲那個應用程序實例化的類加載器上調用一個方法,看起來像這樣

_

public void addClassPaths(String[] classPaths) throws IOException { 

    for (int i = 0; i < classPaths.length; i++) { 

     String resource = classPaths [ i ]; 
     File file = new File(resource).getCanonicalFile(); 

     if (file.isDirectory()) { 

      addURL(file.toURI().toURL()); 
     } 
     else { 

      URL url = new URL("jar", "", "file:" + file.getCanonicalPath() + "!/"); 

      addURL(url); 
     } 
    } 
} 
相關問題