Включить excel в исполняемый файл .jar

Мне нужно прочитать данные из файла excel и показать данные в моем приложении. Я хочу упаковать свой файл excel (файл данных) вместе с исполняемым файлом jar. Я создал исходную папку в папке основного проекта и назвал ее «res». Внутри «res» у меня есть 2 подпапки (обычные папки) с именами «images» и «data». Внутри папки данных я поместил файл excel.

Структура моего проекта

структура проекта

Создать путь

создать путь проекта

Экспортировать как JAR

введите здесь описание изображения

Проблема:

Приложение работает безупречно, когда я запускаю его из Eclipse, но когда я экспортирую его в виде jar, приложение не работает. Оно может найти изображения, но не может найти файл excel.

Другими словами, когда я запускаю приложение изнутри eclipse (щелчок правой кнопкой мыши -> Запуск от имени -> Приложение Java), оно работает отлично. Но при запуске экспортированного JAR-файла ("Tool.jar") ему не удается прочитать данные Excel.

Код для чтения Excel

URL excelResources = getClass().getResource("/excel/data.xls");
File excel = new File(excelResources.toURI());
FileInputStream fis = new FileInputStream(excel);

person Partha Chetry    schedule 30.03.2015    source источник
comment
getClass().getResource("/res/data/MyAwesome.xls") даст вам URL к вашему файлу Excel; getClass().getResourceAsStream("/res/data/MyAwesome.xls") вернет InputStream в ваш файл Excel...   -  person MadProgrammer    schedule 30.03.2015
comment
Не могли бы вы добавить подробности о том, как вы получаете доступ к своим изображениям и Excel? и ошибка, если есть   -  person sathya_dev    schedule 30.03.2015
comment
Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный полный проверяемый пример) или SSCCE (краткий, автономный, правильный пример).   -  person Andrew Thompson    schedule 30.03.2015
comment
stackoverflow.com/a/25636097/2587435   -  person Paul Samsotha    schedule 30.03.2015
comment
@peeskillet: - Спасибо, что указали мне на эту ссылку. Я пробовал их, но не смог решить свою проблему. Проблема связана с экспортированным файлом .jar. Он может найти изображения, но не может загрузить файл excel. Пожалуйста помоги.   -  person Partha Chetry    schedule 31.03.2015
comment
@MadProgrammer: - Спасибо. Я читаю свой Excel так же, как вы упомянули. Он отлично работает, когда я запускаю проект с помощью Eclipse. Но когда я пытаюсь выполнить экспортированный файл jar, он не может прочитать включенный файл excel. Пожалуйста помоги.   -  person Partha Chetry    schedule 31.03.2015
comment
Используйте getResourceAsStream (вместо getResource), который возвращает InputStream. Чтобы прочитать его, вы можете сделать BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));   -  person Paul Samsotha    schedule 31.03.2015
comment
Оборачивать результат getResource в файл - это НЕ то, что вы должны делать. Файл excel НЕ МОЖЕТ быть доступен как файл в системе, потому что это не так, это часть файла jar. Вместо этого, если вам нужен InputStream, используйте getAsStream.   -  person MadProgrammer    schedule 31.03.2015


Ответы (2)


Этот...

URL excelResources = getClass().getResource("/excel/data.xls");
File excel = new File(excelResources.toURI());
FileInputStream fis = new FileInputStream(excel);

Это не то, как работают встроенные ресурсы. Вы больше не можете получить доступ к файлу excel, как если бы это был файл в файловой системе, потому что это не так, он встроен в файл Jar.

Если вам нужен InputStream, используйте Class#getResourceAsStream

try (InputStream is = getClass().getResourceAsStream("/excel/data.xls")) {
    //...
} catch (IOException exp) {
    exp.printStackTrace();
}
person MadProgrammer    schedule 31.03.2015

Используя maven, это можно сделать с помощью плагина:

<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>your.class.Name</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <resources>
                        <resource>
                            <directory>${basedir}/src/main/res/data</directory>
                            <filtering>false</filtering>
                        </resource>
                    </resources>
                </configuration>

                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
person szefuf    schedule 30.03.2015