3

我创建了一种国际象棋游戏(它不完全是国际象棋,但我不知道它是如何用英语调用的)并且我想将它导出为可运行的 jar。

问题是图像(在这个程序中 - 播放器)由于某种奇怪的原因没有被导出。

如何在带有图像的 Eclipse 上导出可运行的 jar?谢谢。

4

3 回答 3

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除您自己的类之外的任何类的实例都是错误和危险的。

于 2012-10-14T10:08:38.657 回答
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;
}
于 2012-10-14T10:11:57.650 回答
0

只需将所有资源(例如图像、文本文件、所有内容)放入可运行 Jar 所在的目录中。它为我解决了这个问题。

于 2014-04-16T19:04:03.400 回答