2009-12-14 5 views
19

У меня есть проект A, который содержит некоторые java-файлы и ресурс R.txt. В рамках проекта я использую ClassLoader.getSystemResource («R.txt»); для извлечения R.txt.Ресурс classpath в jar

Тогда у меня есть проект B, который включает jar-файл проекта A. Теперь getSystemResource («R.txt») не найдет текстовый файл (и да, он все еще находится в корневом файле jar). Даже попытка «/R.txt», как было предложено на каком-то другом сайте, не работала. Есть идеи?

ответ

42

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

URL resource = getClass().getClassLoader().getResource("R.txt"); 
URL resource = Foo.class.getClassLoader().getResource("R.txt"); 
URL resource = getClass().getResource("/R.txt"); 
URL resource = Foo.class.getResource("/R.txt"); 

Примечания ведущего слэша при вызове Class.getResource вместо ClassLoader.getResource; Class.getResource относится к пакету, содержащему класс, если у вас нет ведущей косой черты, тогда как ClassLoader.getResource всегда является абсолютным.

+0

Amazing. Это полностью решило мою проблему. Спасибо за сверхбыстрый ввод // Johan –

+0

Еще один связанный с этим вопрос: мы можем получить InputStream из этих ресурсов URL, но как мы можем создать объект ** File ** из возвращаемого объекта URL. Я попытался создать объект ** URI ** с «URLObject.toURI()» и использовать этот объект URI для создания файла, к сожалению, он генерирует «URI - это не иерархическое исключение». Не могли бы вы мне помочь? Большое спасибо . –

+2

@EnsomHodder: Um, not sure - но не все ресурсы * являются * файлами - в частности, это не так, если он находится в файле jar. –

5

Очевидно, ваш JAR не загружен системным загрузчиком классов, поэтому getSystemResource() не может работать. Это должно работать:

ClassFromProjectA.class.getClassLoader().getResource("R.txt") 

ИМО более удобным ставит ресурсы в том же пакете, классы, которые используют их, так что вы можете использовать более короткий

ClassFromProjectA.class.getResource("R.txt") 

(или, в этом классе просто getClass().getResource("R.txt"))

2

ClassLoader.getResource() Работает? На данный момент вы просто указываете, что должен использоваться системный загрузчик классов.

+0

Работает как шарм. Просто нужно было использовать правильный загрузчик классов :) –

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