在嵌套JAR内的文件夹中查找文件名

时间:2019-11-21 13:17:55

标签: java java-8

当我的应用程序打包为JAR时,我无法到达目标文件夹“ images”。 我得到的不是单个文件,我想要的是“图像”文件夹中所有.jpg文件的列表。

我已经尝试过了: URI uri = getClass().getClassLoader.getResource("images").toURI();

这将返回:jar:file:/C:/test-1.0-SNAPSHOT.jar!/BOOT-INF/lib/core-1.0-SNAPSHOT.jar!/images

然后,我试图创建一个流来迭代这样的文件:

FileSystem fs = FileSystems.newFilesSystem(uri, Collections.emptyMap());
Path p = fs.getPath("images");
Files.walk(p).forEach(path -> System.out.println(path));

这只是给med一个FileNotFoundException。

那么,如何访问嵌套JAR内的“ images”文件夹?

编辑:这与How to list the files inside a JAR file?不重复。我已经尝试了所有的东西。区别在于我在另一个JAR(嵌套JAR)中有一个JAR。我相信这就是造成这个问题的原因。

1 个答案:

答案 0 :(得分:3)

在JDK 12之前,根本不支持内置ZipFileSystem中的嵌套jar文件。

例如,newFileSystem接受ZipFileSystemProvider的{​​{1}}方法具有类似

的语句
Path

即使对于JDK 12,由于对if (path.getFileSystem() != FileSystems.getDefault()) { throw new UnsupportedOperationException(); } URL的持续误操作也很难使用嵌套的zip文件系统。

jar: URL has been specified的语法为:

jar:

这意味着您资源的正确URL将是

jar:<url>!/{entry}

要解析这样的URL,您将必须使用前outer file file:/C:/test-1.0-SNAPSHOT.jar nested jar file jar:file:/C:/test-1.0-SNAPSHOT.jar!/BOOT-INF/lib/core-1.0-SNAPSHOT.jar entry of nested jar:jar:file:/C:/test-1.0-SNAPSHOT.jar!/BOOT-INF/lib/core-1.0-SNAPSHOT.jar!/images 和后jar:之间的部分提取jar文件的位置,然后递归地对其进行解析。 但是,我看到的所有JDK代码,无论是支持!/ API还是URL API都始终无法执行此操作,而是使用FileSystem而不是indexOf("!/")。 因此嵌套的lastIndexOf("!/") URI / URL根本不起作用。

动手嵌套文件系统的唯一方法是使用已经与jar:相关联的Path实例打开它们:

FileSystem

这适用于JDK12或更高版本。

相关问题