如何在不知道Java 9中jar文件的包名称或文件系统路径的情况下列出所有资源


Java 7& 8我用来做

URLClassLoader urlLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
for (URL u : urlLoader.getURLs()) {
    System.out.println("*************** url=" + url);
}

但是在Java 9中,上面给出了一个错误

java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to java.base/java.net.URLClass
Loader

那么如何在不知道jar文件的包前缀或文件系统路径的情况下列出所有资源?

最佳答案
Java9 Release Note声明:

The application class loader is no longer an instance of
java.net.URLClassLoader (an implementation detail that was never
specified in previous releases). Code that assumes that
ClassLoader.getSytemClassLoader() returns a URLClassLoader object will
need to be updated. Note that Java SE and the JDK do not provide an
API for applications or libraries to dynamically augment the class
path at run-time.

add to this from the mailing list,资源查找方法很少,包括以下方式:

>命名模块中的类可以通过Class::getResourceAsStream方法读取自己的资源,该方法返回一个InputStream.它可以通过Class::getResource方法获取其自己资源之一的URL.这些方法不会在其他命名模块中找到资源.
> ClassLoader :: getResource *方法不会在任何资源中找到资源
命名模块.
> ClassClassLoader中的所有现有资源查找方法与类路径上的资源一样工作.
>新的Module::getResourceAsStream方法可以
用于读取任何命名模块的资源,没有限制.

这些选择在Jigsaw的resource encapsulationreadable artifact要求之间提供了平衡.

点赞