如何从多个ClassLoader中的不同位置加载具有相同名称的资源?

时间:2012-04-10 03:57:36

标签: java classloader

我正在尝试编写一个可以部署Tomcat等应用程序的'Application Server'。在部署应用程序时,我创建了一个自定义的ClassLoader实例,并使用它来加载应用程序文件夹中的类和资源。关于ClassLoader还有很多东西需要学习,我仍然对它感到困惑。

我的问题是:不同的ClassLoader实例是否有不同的“类路径”?或者这些ClassLoader实例是否在同一位置寻找资源?

例如,“app1”的资源位于apps/app1/classes/log4j.properties,而“app2”也有一个位于apps/app2/classes/log4j.properties,如何让app1的ClassLoader以正确的路径读取它?

1 个答案:

答案 0 :(得分:0)

这是您在自定义ClassLoader中实现的。

假设您从扩展URLClassLoader开始。

当您解压缩/部署“应用程序”时,您必须在类Loader上调用void addURL(URL url) 将指定的URL附加到URL列表以搜索类和资源。

一个过程可能是这样的

  • 以拉链/战争的形式获取申请
  • 在目录中解压缩
  • 获取解压缩资源(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 );
        }
    }
}