【发布时间】:2014-03-17 05:07:33
【问题描述】:
考虑使用URLs 集合参数化的URLClassLoader,这是扩展目录和jar 文件的混合。例如:
URL[] urls = new URL[] {
new URL("file:/D:/work/temp/jars/spring-security-core-3.2.0.RELEASE.jar"),
new URL("file:/D:/work/temp/jars/spring-security-config-3.2.0.RELEASE.jar"),
...
new URL("file:/D:/work/temp/domain/bin/"),
new URL("file:/D:/work/temp/web/bin/"),
...
}
URLClassLoader cl = new URLClassLoader(urls);
类加载器正确处理getResources() 对位于包内某处的资源的请求,例如"org/my/package/conf.properties"。通过正确处理,我的意思是类加载器成功地找到了目录和 jar 中的所有匹配项。
getResources("") 中传递的特殊空字符串名称应该为所有可用根(在目录和 jar 中)生成 URL。但是,ClassLoaders 中存在一个已知限制,即只返回与目录对应的根。 jar 的所有根都被丢弃。
使用classloader.getURLs[] 而不是classloader.getResources("") 对我不起作用,因为我有一个相互依赖的URLClassLoaders 的复杂图表,因此结果将完全不同。此外,我的类加载器将由使用getResources("") 调用的第三方类路径扫描工具使用,以建立内部搜索库。这种方式根本找不到位于 jar 中的资源。
我目前有一个有效的修复程序,我从 URLClassLoader 扩展并手动处理带有空字符串的请求,除了 URLs 返回的集合中的目录之外,还强制 jar 的根。
但是我的问题是:
造成这种限制的概念/技术原因是什么(不返回 jar 的路径)?
通过手动修复此问题,我是否违反了任何重要合同?
有什么好的方法可以得到想要的行为吗?
感谢您对此的任何想法!
【问题讨论】:
-
“在 getResources("") 中传递的特殊空字符串名称应该产生所有可用根的 URL” - 真的吗?我在
ClassLoader或URLClassLoader的文档中没有看到这一点。您在哪里看到它记录在案? -
我同意,它似乎没有被声明为“特殊”,但它经常被这样使用。提到的忽略罐子的行为是一个事实,例如在Spring docs 中(参见其他说明:警告:部分)。
-
getResources不适用于目录的原因是 jar 文件中没有目录条目。当有条目时,它确实有效(与this answer 比较)。 JDK 的jar命令不会创建目录条目(META-INF除外,这就是为什么getResources("META-INF")确实适用于 jar 文件[但不适用于默认文件系统,该目录通常不存在])。
标签: java url jar classloader