Чтение файла из банки или где-нибудь на пути к классам? - PullRequest
5 голосов
/ 18 марта 2010

Я пытаюсь создать приложение, которое встраивает файл ресурсов в jar, но я бы хотел, чтобы проект был запущен в Eclipse. У меня есть базовая структура maven 2 для моего проекта, и я не уверен, как читать файл так, чтобы он находился и использовался при запуске из JAR или из затмения. Мысль

Состав:

src/main/java
src/main/resources/file.txt

Текущий метод чтения:

getClass().getResourceAsStream("/file.txt")

Есть ли метод чтения, который подберет src / main / resources / *, а также корневой уровень JAR (где развернуты ресурсы)?

Ответы [ 2 ]

8 голосов
/ 18 марта 2010

Я не понимаю твою проблему. Ресурсы из src/main/resources автоматически копируются в target/classes и, таким образом, доступны в пути к классам в Maven и Eclipse относительно корневого уровня в том же месте (если ваш проект Eclipse не настроен должным образом).

А при упаковке внутри JAR содержимое target/classes упаковывается «как есть», поэтому ничего не меняется.

Другими словами, доступ к вашему file.txt, как это совершенно нормально (и это на самом деле , как все задокументировано ):

// Retrieve resource
InputStream is = getClass().getResourceAsStream( "/file.txt" );

// Do something with the resource

...

Если у вас возникла проблема, пожалуйста, уточните.

Обновление: Я провел быстрый тест с помощью плагина maven-eclipse-plugin и не могу воспроизвести вашу проблему:

$ mvn archetype:generate -DgroupId=com.stackoverflow -DartifactId=q2467362 -Dversion=1.0-SNAPSHOT
...
$ cd q2467362
$ mkdir -p src/main/resources
$ mvn eclipse:eclipse
...
$ cat .classpath
<classpath>
  <classpathentry kind="src" path="src/test/java" output="target/test-classes" including="**/*.java"/>
  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
  <classpathentry kind="output" path="target/classes"/>
  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar" sourcepath="M2_REPO/junit/junit/3.8.1/junit-3.8.1-sources.jar"/>
  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
</classpath>

Каталог src/main/resources добавляется как исходная папка, как и ожидалось. Можете ли вы показать свой POM (особенно элемент resources, если вы его определите)?

0 голосов
/ 18 марта 2010

Все, что помещено в src / main / resources с использованием maven2, будет помещено в корневой уровень фляги. Таким образом, метод, который вы используете в настоящее время, будет удовлетворять обоим условиям. Со страницы Maven: http://maven.apache.org/guides/getting-started/index.html#How_do_I_add_resources_to_my_JAR

...