URLClassLoader.getResources(“”)(空资源名称)没有给出jar的根

考虑使用URL集合参数化的URLClassLoaderURL集合是扩展目录和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子的路径)?

  • 通过手动修复,我是否违反任何重要合同?

  • 有没有很好的方法来获得理想的行为?

谢谢你的任何想法!