我正在尝试编写一个可以部署Tomcat等应用程序的'Application Server'。在部署应用程序时,我创建了一个自定义的ClassLoader实例,并使用它来加载应用程序文件夹中的类和资源。关于ClassLoader还有很多东西需要学习,我仍然对它感到困惑。
我的问题是:不同的ClassLoader实例是否有不同的“类路径”?或者这些ClassLoader实例是否在同一位置寻找资源?
例如,“app1”的资源位于apps/app1/classes/log4j.properties
,而“app2”也有一个位于apps/app2/classes/log4j.properties
,如何让app1的ClassLoader以正确的路径读取它?
答案 0 :(得分:0)
这是您在自定义ClassLoader中实现的。
假设您从扩展URLClassLoader
开始。
当您解压缩/部署“应用程序”时,您必须在类Loader上调用void addURL(URL url)
将指定的URL附加到URL列表以搜索类和资源。
一个过程可能是这样的
_
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 );
}
}
}