Как заставить getResourceAsStream работать при отладке Java в Eclipse? - PullRequest
7 голосов
/ 17 апреля 2009

Это ошеломляет ... Я могу заставить getResource () и getResourceAsStream () работать правильно, когда я запускаю Java на своем упакованном JAR-файле, который содержит текстовый файл. (для справки см. документацию Sun по доступу к ресурсам ). Я не могу заставить ту же программу работать должным образом, когда запускаю ее в Eclipse, даже если я поместил свой текстовый файл в то же дерево как мои скомпилированные файлы .class

Может ли один из вас указать мне на какие-то тонкости, чтобы убедиться, что функции getResource () и getResourceAsStream () работают правильно?

У меня есть догадка, что это связано с CLASSPATH и / или где Eclipse помещает файлы .class, которые он автоматически компилирует. (Я заметил, что когда я запускаю Ant, он компилирует все файлы Java, которые изменились со времени моей последней сборки Ant, хотя Eclipse уже скомпилировал эти файлы Java.)

Ответы [ 6 ]

16 голосов
/ 17 апреля 2009

Несколько заметок:

Во-первых, как говорит Чокос, поместите его в исходные каталоги затмений, а не в двоичные. Eclipse очистит двоичные каталоги, когда вы «очистите», а также очистите несопоставленные файлы. Он скопирует исходные файлы, отличные от Java, в двоичный каталог.

Это означает, что даже если вы удалите файл в двоичном каталоге, он может быть удален с помощью eclipse ...

Имейте в виду, что getResourceAsStream и getResource работают относительно пакета кода, который их вызывает. Например:

package a.b.c;
public class Foo {
   ...
   getClass().getClassLoader().getResourceAsStream("fee.txt");
   ...
}

Это на самом деле будет искать a / b / c / fee.txt; Пакет предварительно написан. Это хорошо работает, если у вас есть файл fee.txt в том же исходном каталоге, что и файл Foo.java, или если у вас есть отдельный набор каталогов ресурсов в пути к классам с той же структурой каталогов.

Если вы используете

...getResourceAsStream("/fee.txt");

он будет искать файл fee.txt прямо на пути к классам.

При запуске из командной строки, где в JAR находится файл ресурсов? - Скотт

10 голосов
/ 17 апреля 2009

Если вы поместите ваш текстовый файл вместе с исходными файлами, Eclipse скопирует его туда, куда он помещает свои скомпилированные файлы .class, и вы увидите ваш текстовый файл при запуске приложения из Eclipse (и вы будете возможность редактировать файл из Eclipse).

2 голосов
/ 17 апреля 2009

Нашел проблему!

У меня есть мои файлы изображений в дереве исходных текстов. (в моей сборке Ant я копирую их в каталог сборки)

Проблема заключалась в том, что я недавно не обновлял исходное дерево в Eclipse. Итак, файлы были там, но Eclipse не обращал на них никакого внимания.

Спасибо за подсказку о том, что Eclipse должен иметь их в моем дереве исходников.

1 голос
/ 11 октября 2010

У меня была та же проблема с IntelliJ, решение которой было: В настройках проекта добавьте папку с файлами ресурсов, в моем случае звуковые файлы, в качестве источника. Добавьте? *. Wav (или ваш pref тип файла) в Настройки-> Шаблоны ресурсов компилятора.

1 голос
/ 17 апреля 2009

У меня есть догадка, что это связано с CLASSPATH и / или где Eclipse помещает файлы .class, которые он автоматически компилирует.

В разделе «Запустить конфигурацию», если вы запускаете приложение, перейдите на вкладку «Путь к классам» и добавьте корневую папку пути, который вы используете для доступа к файлу.

Так, например, если вы пытаетесь загрузить «blah / file.txt», а файл находится в «folder / blah / file.txt», добавьте «folder» в classpath. Если вы пытаетесь загрузить ресурс только с помощью «file.txt», то добавьте «folder / blah».

0 голосов
/ 17 апреля 2009

Что именно вы имеете в виду под "работать должным образом"? В чем ошибка / поведение?

Я предлагаю использовать getResource, чтобы найти URL одного из ваших .class файлов (или примерно эквивалентно getClass().getProtectionDomain().getCodeSource(). Вы можете обнаружить, что он указывает куда-то неожиданно.

...