在
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 aURLClassLoader
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 *方法不会在任何资源中找到资源
命名模块.
> Class
和ClassLoader
中的所有现有资源查找方法与类路径上的资源一样工作.
>新的Module::getResourceAsStream
方法可以
用于读取任何命名模块的资源,没有限制.
这些选择在Jigsaw的resource encapsulation和readable artifact要求之间提供了平衡.