2012-04-10 46 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); 
     } 
    } 
} 
相关问题