我创建了一种国际象棋游戏(它不完全是国际象棋,但我不知道它是如何用英语调用的)并且我想将它导出为可运行的 jar。
问题是图像(在这个程序中 - 播放器)由于某种奇怪的原因没有被导出。
如何在带有图像的 Eclipse 上导出可运行的 jar?谢谢。
我创建了一种国际象棋游戏(它不完全是国际象棋,但我不知道它是如何用英语调用的)并且我想将它导出为可运行的 jar。
问题是图像(在这个程序中 - 播放器)由于某种奇怪的原因没有被导出。
如何在带有图像的 Eclipse 上导出可运行的 jar?谢谢。
推荐的方法是resource
在项目根目录下有一个目录,并将其包含在源代码目录列表中。这将导致那里的所有图像都被复制到 JAR 中。如果你在那里创建一个子目录resource/image
,那么你最终会得到一个有image
目录的 JAR。您可以通过类加载器访问这些图像:
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;
}
只需将所有资源(例如图像、文本文件、所有内容)放入可运行 Jar 所在的目录中。它为我解决了这个问题。