2016-08-28 15 views
1

私はデフォルトのsrcディレクトリの外にある私のリソースにアクセスすることができないrunnable jarファイルを持っています。Javaクラスローダーがjarファイル内のリソースを見つけることができません

public class Foo { 

    private static final ClassLoader CLASS_LOADER = Foo.class.getClassLoader(); 

    public static File getResourceFile(String relativePath) { 
     // Since I'm using getClassLoader, the path will resolve starting from 
     // the root of the classpath and it'll take an absolute resource name 
     // usage: getResourceFile("img/img1.png") 
     // result: Exception in thread "main" java.lang.NullPointerException 
     return new File(CLASS_LOADER.getResource(relativePath).getFile()); 
    } 
} 

フォルダのセットアップ:What is the difference between Class.getResource() and ClassLoader.getResource()からの私の理解に基づいて、私は次のgetResourceFile機能を使って、ルート/ RES/IMG/img1.png(下記参照フォルダの設定)にアクセスすることができるはず

root/ 
    src/ 
     foo/ 
      bar/ 
    res/ 
     img/ 
      img1.png 
     audio/ 
      audio1.wav 

jar実行ファイル自体を実行しようとすると問題が発生します。しかし、奇妙なことは、私は実際にパスを正しく解決することができたeclipse IDEを通してこれを複製することができなかったことです。私はJavaが実行時にリソースフォルダを見つけることができるように、(プロジェクト - >プロパティ - > Javaビルドパス - >フォルダの追加を介して)ビルドパスにリソースディレクトリを追加しました。

jarファイルの生成に関して何かがありますか?瓶を開梱すると、すべてがIMGとルート(上記の初期フォルダの設定を与えられた)にあるオーディオディレクトリとの順序であると思われるファイル:

foo/ 
    /bar 
img/ 
    img1.png 
audio/ 
    audio1.wav 
+0

あなたは 'relativePath'の値を投稿できますか? –

+1

'jar'に入ると、リソースはもはや「ファイル」ではなくなりました。そのURIを 'File'に入れると、そのファイルはファイルシステムにないので見つからないでしょう。ファイルではなく入力ストリームとして使用することになっています。 – RealSkeptic

+0

@DavidPérezCabrera:例:img/img1.png – Alan

答えて

5

Fileのは、あなたのファイルシステム内の実際のファイルを表すために使用することができます。また、ファイルをJARにパッケージすると、リソース(img/img1.png)はファイルではなく、JARファイルのエントリになります。 Eclipse内からフォルダ構造を使用している限り、リソースは個別のファイルなので、すべてが問題ありません。

System.out.println(CLASS_LOADER.getResource(relativePath)); 

それはURLを出力しますが、それはあなたのファイルシステム内のファイルへの有効なパスではありませんが、JARファイル内のエントリへ:

はこれを試してみてください。

通常、リソースを読み取るだけです。その場合は、getResourceAsStream()を使用してInputStreamを開きます。

関連する問題