URLClassLoader.getResources(“”)(空资源名称)没有给出jar的根
考虑使用URL
集合参数化的URLClassLoader
, URL
集合是扩展目录和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("")
传递的特殊空字符串名称应该产生所有可用根的URL(在目录和jar中)。 但是, ClassLoader
存在一个已知的限制,它只导致返回与目录对应的根。 所有根jar子都被丢弃了。
使用classloader.getURLs[]
而不是classloader.getResources("")
将无法使用,因为我有一个相互依赖的URLClassLoader
的复杂图形,因此结果将完全不同。 此外,我的类加载器将由使用getResources("")
调用的第三方类路径扫描工具使用,以便设置内部搜索库。 这样就无法找到位于jar子里的资源。
我目前有一个工作修复,我从URLClassLoader
扩展并手动处理带有空字符串的请求,除了返回URL
的返回集合中的目录之外,还强制执行jar的根。
不过我的问题是:
-
这种限制的概念/技术原因是什么(不返回jar子的路径)?
-
通过手动修复,我是否违反任何重要合同?
-
有没有很好的方法来获得理想的行为?
谢谢你的任何想法!