当我的应用程序打包为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。我相信这就是造成这个问题的原因。
答案 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或更高版本。