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

在Java9中,如何在不知道jar文件的包名或文件系统路径的情况下列出所有资源,java,resources,classloader,java-9,Java,Resources,Classloader,Java 9,在Java7和Java8中,我通常能够 URLClassLoader urlLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); for (URL u : urlLoader.getURLs()) { System.out.println("*************** url=" + url); } 但是在Java9中,上面给出了一个错误 java.lang.ClassCastException: java.ba

在Java7和Java8中,我通常能够

URLClassLoader urlLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
for (URL u : urlLoader.getURLs()) {
    System.out.println("*************** url=" + url);
}
但是在Java9中,上面给出了一个错误

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

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

由于迁移到模块化体系结构,不再支持查找类路径的旧方法:

应用程序类装入器不再是的实例 URLClassLoader,而是内部类的。这是默认值 用于既不是Java SE也不是JDK的模块中的类的装入器 模块

您可以尝试直接解析classpath属性,或者尝试使用
ModuleFinder
和friends对模块执行操作。

状态如下:

应用程序类装入器不再是的实例
java.net.URLClassLoader
(一个从未公开过的实现细节 在以前的版本中指定)。假定
ClassLoader.getSytemClassLoader()
返回一个
URLClassLoader
对象 需要更新。请注意,JavaSE和JDK不提供 应用程序或库动态扩充类的API 运行时的路径

到目前为止,很少有资源查找方法,包括以下方法:

  • 命名模块中的类可以通过返回
    InputStream
    的方法读取自己的资源。它可以通过该方法获得指向自己资源之一的URL。这些方法不会在其他命名模块中找到资源

  • ClassLoader::getResource*
    方法在任何数据库中都找不到资源 命名模块

  • 和中的所有现有资源查找方法的工作方式都与今天对类路径上的资源的工作方式相同

  • 这种新方法是可行的 用于无限制地读取任何命名模块的资源


这些选择在Jigsaw和需求之间提供了一个平衡。

我找到的最佳答案是为getResources提供一个参数,当然这意味着您知道资源所在路径的前缀

  ArrayList<URL> resources = new ArrayList<URL>();
  ClassLoader urlLoader = ClassLoader.getSystemClassLoader();
  Enumeration<URL> eU = urlLoader.getResources("com");
  while (eU.hasMoreElements()) {
     URL u = eU.nextElement();
     JarFile jarFile = new JarFile(u.getFile().replace("file:/", "").replaceAll("!.*$", ""));
     Enumeration<JarEntry> e = jarFile.entries();
     while (e.hasMoreElements()) {
        JarEntry jarEntry = e.nextElement();
        resources.add(urlLoader.getResource(jarEntry.getName()));
     }
  }
ArrayList resources=new ArrayList();
ClassLoader urlLoader=ClassLoader.getSystemClassLoader();
枚举eU=urlLoader.getResources(“com”);
while(eU.hasMoreElements()){
URL u=eU.nextElement();
JarFile JarFile=new-JarFile(u.getFile().replace(“文件:/”,“”)。replaceAll(“!.$”,“”));
枚举e=jarFile.entries();
而(e.hasMoreElements()){
JarEntry JarEntry=e.nextElement();
resources.add(urloader.getResource(jarEntry.getName());
}
}

我已经检查过了,但是我的问题仍然没有解决办法。考虑番石榴是什么。没有比这更好的解决办法了。()谢谢,但是第462行使用了URLClassLoader(对于Java7和Java8是可以的),然后第466行使用了类路径,这正是我在评论中所说的。没有更好的解决方案。:)不能保证每个类路径组件都包含一个
com
资源(目录)。除此之外,为什么不使用
System.getProperty(“java.class.path”)
,这是自java 1.0以来获取类路径的官方方法,仍然在java 9中工作?@Holger yes同意我的观点,我知道我要找的包前缀对我很有用。。。