2

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

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

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

4

1 回答 1

0

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

假设您从扩展URLClassLoader.

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

一个过程可能是这样的

  • 让你的应用程序作为 zip/war
  • 解压到目录
  • 获取解压缩资源(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 );
        }
    }
}
于 2012-04-10T15:04:01.523 回答