ある種のチェス ゲームを作成しました (正確にはチェスではありませんが、英語でどのように呼び出されたかはわかりません)。それを実行可能な jar としてエクスポートしたいと考えています。
問題は、画像 (このプログラムでは - プレーヤー) が何らかの奇妙な理由でエクスポートされないことです。
画像付きのEclipseで実行可能なjarファイルをエクスポートするには? ありがとう。
ある種のチェス ゲームを作成しました (正確にはチェスではありませんが、英語でどのように呼び出されたかはわかりません)。それを実行可能な jar としてエクスポートしたいと考えています。
問題は、画像 (このプログラムでは - プレーヤー) が何らかの奇妙な理由でエクスポートされないことです。
画像付きのEclipseで実行可能なjarファイルをエクスポートするには? ありがとう。
推奨される方法はresource
、プロジェクトルートの下にディレクトリを作成し、それをソースコードディレクトリのリストに含めることです。これにより、そこにあるすべての画像がJARにコピーされます。そこにサブディレクトリを作成すると、ディレクトリresource/image
を持つJARになりますimage
。これらの画像には、クラスローダーを介してアクセスします。
classloader.getResourceAsStream("/image/name.jpg");
または、リソースURLを受け入れるAPIに画像を渡すときはいつでも:
classloader.getResource("/image/name.jpg");
もちろん、これはすべて、JARをどの程度正確に構築するかによって異なりますが、EclipseのExport JARを介して行うと、私が説明していることを実現できます。Mavenを使用する場合、私が説明したものと非常によく似たアプローチがあります。
また、クラスローダーをフェッチするコードのデモンストレーションは意図的に避けています。これはJavaの重要なサブジェクトであり、コンテキスト固有の方法で実行する必要があるためです。ただし、画像と同じJARにあるクラスから実行する場合は、インスタンスメソッドからこれが機能することは間違いありません。
this.getClass().getClassLoader();
this
ここではオプションであり、コードスタイルの観点からは実際には推奨されませんが、わかりやすくするため、またgetClass
自分以外のクラスのインスタンスを呼び出すのは間違っていて危険であるため、ここに含めました。
興味深いと思われる場合に備えて、いくつかの例を挙げましょう。
リソース (画像) を jar ファイルから DataOutPutStream に書き込むには:
public static void readResourceFromJarToDataOutputStream(String file,
DataOutputStream outW) {
try {
InputStream fIs = new BufferedInputStream(new Object() {
}.getClass().getResourceAsStream(file));
byte[] array = new byte[4096];
for (int bytesRead = fIs.read(array); bytesRead != -1; bytesRead = fIs
.read(array)) {
outW.write(array, 0, bytesRead);
}
fIs.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
リソースをメモリ (バイト配列) にロードするには:
public static byte[] readResourceFromJarToByteArray(String resource) {
InputStream is = null;
byte[] finalArray = new byte[0];
try {
is = new Object() {
}.getClass().getResourceAsStream(resource);
if (is != null) {
byte[] array = new byte[4096];//your buffer size
int totalBytes = 0;
if (is != null) {
for (int readBytes = is.read(array); readBytes != -1; readBytes = is
.read(array)) {
totalBytes += readBytes;
finalArray = Arrays.copyOf(finalArray, totalBytes);
System.arraycopy(array, 0, finalArray, totalBytes- readBytes,
readBytes);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return finalArray;
}