我创造了一种国际象棋游戏(它不完全是国际象棋,但我不知道它是如何用英语调用的)我希望将其导出为runnable jar。
问题在于图像(在此程序中 - 玩家)不会出于某种奇怪的原因导出。
如何使用图像导出eclipse上的runnable jar?感谢。
答案 0 :(得分:5)
推荐的方法是在项目根目录下有一个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
都是错误和危险的除了你自己的。
答案 1 :(得分:1)
让我举几个例子,以防你觉得有趣:
将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;
}
答案 2 :(得分:0)
只需将所有资源(如图像,文本文件,所有内容)放入可运行Jar的目录中即可。它解决了我的问题。