61

リソースフォルダーにファイルがあります。たとえば、リソース フォルダーからファイルを取得する必要がある場合は、次のようにします。

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

しかし、 Mavenを使用してjarファイルを作成すると:

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ファイルにその問題があるのはなぜですか? どう思いますか?

リソースフォルダーのパスを取得する別の方法はありますか?

4

3 に答える 3

91

あなたが使用している必要があります

getResourceAsStream(...);

リソースがjar/warまたはその他の単一ファイルパッケージとしてバンドルされている場合。

ご覧のとおり、jar は、多数のファイルをまとめて保持する単一のファイル (zip ファイルのようなもの) です。Osのpovから、それは単一のファイルであり、(画像ファイル)にアクセスしたい場合は、part of the fileそれをストリームとして使用する必要があります。

ドキュメンテーション

于 2013-08-05T10:06:03.647 に答える
11

Eclipse RCP / プラグイン開発者向けのソリューションは次のとおりです。

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();
}

FileLocator.toFileURL(fileURL)ではなく、を使用することが非常に重要resolve(fileURL) です。プラグインが jar にパックされると、Eclipse が一時的な場所にアンパックされたバージョンを作成し、File. たとえば、Lars Vogel の記事には誤りがあると思います - http://blog.vogella.com/2010/07/06/reading-resources-from-plugin/

于 2014-05-30T13:45:05.010 に答える