1

重複の可能性:
jar内にファイルをロード

最後に、jarファイルをほぼ正しく機能させました。ほとんどの場合、jarファイルを作成した直後にテストして起動すると、アーカイブに含まれている画像が表示されます。しかし、jarファイルを他のディレクトリに移動して起動しようとすると、画像の欠落に関する例外が発生します(ただし、アプリケーションは引き続き機能しますが、その画像は表示されません)。

これは私のディレクトリでどのように見えるかです:

[aqv@voland Converter]$ ll
razem 112
-rw-rw-r--. 1 aqv aqv 51673 10-30 20:42 Converter.java
-rw-rw-r--. 1 aqv aqv    23 10-30 20:41 Converter.mf
-rw-rw-r--. 1 aqv aqv  1167 10-30 20:43 GBC.java
-rw-rw-r--. 1 aqv aqv  1023 10-30 20:58 ImagePanel.java
-rw-rw-r--. 1 aqv aqv 44729 10-30 20:35 programHelp.png
-rw-rw-r--. 1 aqv aqv  3713 10-30 20:43 SettingsManager.java
[aqv@voland Converter]$ 
[aqv@voland Converter]$ 

画像ファイルはImagePanelから呼び出され、programHelpは文字列であり、適切なメソッドに渡されます。

public ImagePanel() {

    programHelp = "programHelp.png";

    try {
        helpImage = ImageIO.read(new File(programHelp));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

ご覧のとおり、ディレクトリが指定されていないので、メインクラスはjarのメインディレクトリで画像を探す必要があると思いますね。

私は次の方法でjarファイルを作成します(もちろん、ファイルをコンパイルした後):

[aqv@voland Converter]$ jar cvfm Converter.jar Converter.mf *.class *.png
[aqv@voland Converter]$ 

画像ファイルは、クラスファイルの中でjarアーカイブ内に表示されます。私の質問:この場合の画像ファイルの配置の何が問題になっていますか?

4

1 に答える 1

4

あなたのプログラムは偶然に動いているだけです - それは実際には JAR の外から PNG をロードしています。イメージの名前を一時的に変更し、必要に応じて JAR をディレクトリに保持することで、これをテストできます。

JAR 内からリソースをロードするには、ファイルを直接ロードするのではなく、 Class オブジェクトの getResource() メソッドの1 つを使用する必要があります。

たとえば、ImageIOによって返されたストリームからデータをロードするために引き続き を使用できます。getResourceAsStream()次のようなもの:

InputStream is = this.getClass().getResourceAsStream("my.png");
helpImage = ImageIO.read(is);
于 2012-10-30T20:53:40.117 に答える