如何在Eclipse上导出带有图像的jar?

时间:2012-10-14 09:57:32

标签: java eclipse image jar embedded-resource

我创造了一种国际象棋游戏(它不完全是国际象棋,但我不知道它是如何用英语调用的)我希望将其导出为runnable jar。

问题在于图像(在此程序中 - 玩家)不会出于某种奇怪的原因导出。

如何使用图像导出eclipse上的runnable jar?感谢。

3 个答案:

答案 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的目录中即可。它解决了我的问题。