为什么我的URI没有分层?

gre*_*rep 47 java jar executable-jar maven java-7

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

File myFile= new File(MyClass.class.getResource(/myFile.jpg).toURI());             
System.out.println(MyClass.class.getResource(/myFile.jpg).getPath());
Run Code Online (Sandbox Code Playgroud)

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

路径是

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

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

mvn package
Run Code Online (Sandbox Code Playgroud)

...然后启动我的应用程序:

java -jar MyJar.jar
Run Code Online (Sandbox Code Playgroud)

我有以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

... 和文件的路径是:

file:/D:/java/projects/.../target/MyJar.jar!/X/Y/Z/myFile.jpg
Run Code Online (Sandbox Code Playgroud)

当我尝试从资源文件夹中获取文件时,会发生此异常.在这条线上.为什么?为什么JAR文件中存在这个问题?你怎么看?

有另一种方法,获取资源文件夹路径?

roc*_*boy 72

你应该使用

getResourceAsStream(...);
Run Code Online (Sandbox Code Playgroud)

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

看到的是,jar是一个单独的文件(有点像zip文件),它们将大量文件放在一起.从Os的pov,它是一个单独的文件,如果你想访问part of the file(你的图像文件),你必须将它用作流.

文档

  • 是否有可能将其转换为 java.io.File? (6认同)

Ily*_*iuk 11

这是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();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你,我欠你一杯啤酒,事实上Vogella的文章需要更新. (3认同)