2009-04-17 3 views
7

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

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

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

+0

обратитесь к ответу эюгнера http://stackoverflow.com/questions/5490547/problem-loading-resources-while-running-in-eclipse –

ответ

10

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

+1

Также убедитесь, что Eclipse знает о файлах: «Обновить» исходное дерево, если они были добавлены за пределы Eclipse. (Как отметил Джейсон С. в другом ответе.) –

1

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

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

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

0

Что именно вы подразумеваете под «правильной работой»? Что такое ошибка/поведение?

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

16

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

Для начала - как.. Chocos говорит, поместив его в источники eclipse source, а не в двоичные файлы. Eclipse очистит двоичные файлы, когда вы «очистите», а также очистите непревзойденные файлы. Он скопирует исходные файлы, не связанные с java, в двоичный каталог.

Это означает, что даже если вы отбрасываете файл в двоичном формате d ir, его можно удалить eclipse ...

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

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

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

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

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

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

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

2

Обнаружена проблема!

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

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

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

+1

Если вы перейдете в Window-> Preferences-> General-> Workspace, установите флажок «Обновить автоматически», что предотвратит эту проблему в будущем. В противном случае убедитесь, что вы добавили вещи в проект через eclipse (вы можете File-> Import и на некоторых платформах просто перетаскивать элементы в проект) –

1

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

Смежные вопросы