2010-04-14 3 views
9

У меня есть файл jar с ресурсами (в основном, для кэшей, ведения журналов и т. Д.), Которые я хочу распространять.Доступ к ресурсам JAR

У меня возникли проблемы с относительными путями для этих ресурсов, так что я сделал то, что я нашел в другом StackOverflow вопрос, в котором говорилось, что это было правильным способом:

ClassInTheSamePackageOfTheResource.class.getResourceAsStream('resource.xml'); 

К сожалению, это делает не работа.

Любые идеи? Благодаря!

PS: Очевидно, что я не могу использовать абсолютные пути, и я хотел бы избежать переменные окружения, если это возможно

+0

Является ли файл ресурсов в той же папке, что и файл класса? Является ли это автономным приложением или работает на веб-сервере? – kgiannakakis

+0

Действительно в той же папке. Это банка, предназначенная для включения в веб-приложение, да (но я думаю, что это должно быть неуместно) –

+2

Соответственно правила поиска ресурсов, связанных с данным классом, реализуются определяющим загрузчиком классов. Таким образом, загрузчик классов вашего веб-приложения может вести себя несколько иначе, основываясь на реализации. Просто мысль. –

ответ

11

Убедитесь, что ваша папка ресурса указана в качестве исходной папки в настройках вашего проекта. Кроме того, убедитесь, что папка ресурса настроена на экспорт, когда вы строите свою банку.

Вы можете добавить расширение .zip в свой файл jar, затем откройте его, чтобы убедиться, что ваши ресурсы включены и в ожидаемом месте.

Я всегда использовать абсолютные пути, как это:

InputStream input = this.getClass().getResourceAsStream("/image.gif"); 

Когда вы используете абсолютные пути, «/» является корневой папке в файле фляги, а не корневой папке хост-машине.

+4

+1 для обратите внимание на/являющуюся корневой папкой jar. – Powerlord

+0

Действительно, я использовал метод абсолютного пути (jar), который вы описали, и это сработало! Не знаю, почему он не сделал трюк с относительным ... но достаточно хорошо достаточно –

1

Я всегда озадачить через getResourceAsStream, чтобы сделать эту работу. Если "resource.xml" находится в org/pablo/opus, я думаю вы хотите:

Name.class.getResourceAsStream("org.pablo.opus.resource.xml"); 
1

где resource.xml нашли? Если в корне исходного дерева, попробуйте префикс его с помощью /.

+0

Это не в корне исходного дерева. Он находится внутри пакета –

+1

, поэтому рассматривайте полное имя как абсолютный путь, например com.me.and.u.effects.css будет доступен как /com/me/and/u/effects.css – Seffi

1

Я обычно хранить файлы и другие ресурсы, а затем получить их в качестве URL-адресов:

URL url = MyClass.class.getResource("/design/someResource.png"); 

в статическом контексте, или иначе:

URL url = getClass().getResource("/design/someResource.png"); 

От экземпляра.

Приведенные выше фрагменты предполагают, что дизайн - это папка верхнего уровня внутри банки. В общем случае, если путь начинается с «/», он принимает абсолютный путь, иначе он относителен к местоположению класса.

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