为什么我的 URI 不是分层的?

2022-08-31 15:23:19

我在资源文件夹中有文件。例如,如果我需要从资源文件夹中获取文件,我喜欢这样:

File myFile= new File(MyClass.class.getResource(/myFile.jpg).toURI());             
System.out.println(MyClass.class.getResource(/myFile.jpg).getPath());

我已经测试过了,一切正常

路径为

/D:/java/projects/.../classes/X/Y/Z/myFile.jpg

但是,如果我使用 创建 jar 文件,Maven

mvn package

...,然后启动我的应用:

java -jar MyJar.jar

我有以下错误:

Exception in thread "Thread-4" java.lang.RuntimeException: ხელმოწერის განხორციელება შეუძლებელია
Caused by: java.lang.IllegalArgumentException: URI is not hierarchical
        at java.io.File.<init>(File.java:363)

...文件的路径为

file:/D:/java/projects/.../target/MyJar.jar!/X/Y/Z/myFile.jpg

当我尝试从资源文件夹中获取文件时,会发生此异常。在这一行。为什么?为什么在JAR文件中有这个问题?你觉得怎么样?

是否有其他方法可以获取资源文件夹路径?


答案 1

您应该使用

getResourceAsStream(...);

当资源被捆绑为jar/war或任何其他单个文件包时。

看到问题是,jar是一个单一的文件(有点像zip文件),将许多文件放在一起。从Os的pov来看,它是一个文件,如果你想访问一个(你的图像文件),你必须把它用作流。part of the file

文档


答案 2

以下是 Eclipse RCP / Plugin 开发人员的解决方案:

Bundle bundle = Platform.getBundle("resource_from_some_plugin");
URL fileURL = bundle.getEntry("files/test.txt");
File file = null;
try {
   URL resolvedFileURL = FileLocator.toFileURL(fileURL);

   // We need to use the 3-arg constructor of URI in order to properly escape file system chars
   URI resolvedURI = new URI(resolvedFileURL.getProtocol(), resolvedFileURL.getPath(), null);
   File file = new File(resolvedURI);
} catch (URISyntaxException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
}

使用而不是非常重要,因为当插件被打包到jar中时,这将导致Eclipse在临时位置创建一个解压缩版本,以便可以使用File访问对象。例如,我猜拉尔斯·沃格尔(Lars Vogel)在他的文章中有一个错误 - http://blog.vogella.com/2010/07/06/reading-resources-from-plugin/FileLocator.toFileURL(fileURL)resolve(fileURL)


推荐