Как экспортировать банку с изображениями на Eclipse?

Я создал какую-то шахматную игру (это не совсем шахматы, но я не знаю, как они называются по-английски), и я хочу экспортировать ее как пригодную для работы флягу.

Проблема в том, что изображения (у этой программы - плееры) не экспортируются по какой-то странной причине.

Как экспортировать работающую банку на затмение с изображениями? Благодарю.

 Andrew Thompson14 окт. 2012 г., 12:00
Вы уверены, что изображения не находятся в банке? Как вы проверяли? Как код получает доступ к изображениям? НАПРИМЕР. ПоFile, URL и т.п.
 PbxMan14 окт. 2012 г., 12:08
откройте файл JAR, вы уверены, что ваши изображения не там?

Ответы на вопрос(3)

такие как изображения, текстовые файлы, ВСЕ в каталог, где будет находиться исполняемый файл Jar. Это решило проблему для меня.

если вы найдете их интересными:

Чтобы записать ресурс (изображение) из файла 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;
}
 PbxMan14 окт. 2012 г., 15:36
Вы были правы, я не знаю, почему я имел в виду текстовые файлы.
 Aubin14 окт. 2012 г., 13:33
Очень хороший анти-шаблон! Где вы видели изображение, которое может быть построено из StringBuffer? Первоначальный вопрос был «экспорт изображений в JAR» ...
 PbxMan14 окт. 2012 г., 12:19
Вы правы, позвольте мне немного его настроить
 Andrew Thompson14 окт. 2012 г., 12:17
«Другой пример чтения файла в функции jar:» Не очень хороший. 1)readFileString(String file) Ресурс не являетсяFileтак что стоит не путать пользователя, подразумевая, что это так. Я бы пошел наreadFileString(String resourcePath) 2) Лучше объявитьthrows чем пытаться справиться с ними самостоятельно безfinally или затем продолжить, чтобы вернуть ноль или пустойStringBuffer - Это не источник для других учиться.

Рекомендуемый способ будет иметьresource под корневым каталогом вашего проекта и включите его в список каталогов исходного кода. Это приведет к тому, что все изображения будут скопированы в JAR. Если вы сделаете подкаталог там,resource/imageтогда вы получите банку сimage каталог. Вы получаете доступ к этим изображениям через загрузчик классов:

classloader.getResourceAsStream("/image/name.jpg");

или всякий раз, когда вы передаете изображение в API, который принимает URL ресурсов:

classloader.getResource("/image/name.jpg");

Конечно, все зависит от того, как именно вы создадите свой JAR, но если вы сделаете это с помощью Eclipse Export JAR, вы сможете достичь того, что я описываю. Если вы используете Maven, есть подход, очень похожий на тот, который я описал.

Также обратите внимание, что я намеренно избегаю демонстрации кода, который выбирает загрузчик классов, так как это нетривиальный предмет в Java и должен выполняться контекстно-зависимым способом. Однако, если вы делаете это из класса, который находится в том же JAR-файле, что и изображения, можно с уверенностью предположить, что это будет работать из метода экземпляра:

this.getClass().getClassLoader();

this здесь не является обязательным, и фактически не рекомендуется с точки зрения стиля кода, но я включил его для ясности и потому, что это было бы неправильно и опасно вызыватьgetClass на экземпляр любого класса, кроме вашего собственного.

 Andrew Thompson14 окт. 2012 г., 12:20
Отличный ответ. Теперь я смотрю на это более внимательно, также обратите внимание, чтоclassloader.getResource("/images/name.jpg"); также может быть очень удобным, например, для Java Sound API, гдеAudioSystem как правило, нуждается в перемещаемом входном потоке.
 Marko Topolnik14 окт. 2012 г., 12:21
Обычно, где бы API ни принимал URL ресурса, а не поток, я бы сказал, что это предпочтительный подход.
 Andrew Thompson14 окт. 2012 г., 12:21
getClass().getClassLoader(); Префикс, который поthis.getClass().getClassLoader(); и это в значительной степени подразумевает пользовательский класс, разработанный программистом.
 Marko Topolnik14 окт. 2012 г., 12:22
@ AndrewThompson Я не понял твою точку зрения сthis.getClass(), Первоначально я написал это таким образом, но удалил его за то, что он избыточен и не совсем идиоматичен для Java (квалифицирующие методы экземпляров с явнымthis). Ваша точка зрения состоит в том, что более образовательно оставить это? Потому что это была моя первоначальная мотивация.
 Andrew Thompson14 окт. 2012 г., 12:32
"недостаточно четко" Да, я думаю, что это так, но ваше объяснение лучше. Можете ли вы изменить его в ответ?

Ваш ответ на вопрос