загрузчик классов - PullRequest
       6

загрузчик классов

0 голосов
/ 23 февраля 2009

У меня проблема с загрузчиками классов. Все время.

Иногда это работает, иногда это не работает.

Когда я начинал, я проверял это работает, но не из * .jar:

URL url = AcAnalyzer.class.getResource ("../ stuff / resource");

// и это работает даже из файла jar:

URL url = Acnalyzer.class.getResource ("/ stuff / resource");

URL url = AcAnalyzer.class.getClassLoader (). GetResource ("stuff / resource");

// Но у меня возникла проблема с tomcat ... когда мне нужно было развернуть ее в tomcat, мне пришлось сделать следующее:

URL-адрес URL = Thread.currentThread (). GetContextClassLoader (). GetResource ("something.xml");

, где что-то должно быть в WEB-INF / classes /

... url.getFile ();

// Проблема в том, что большую часть времени он должен работать внутри, а не внутри фляги одновременно. Теперь у меня есть тест, где мой класс получает ресурс, и файл jar используется в каком-то проекте, развернутом под tomcat ... и почему-то он больше не хочет работать:

Я немного озадачен загрузчиками классов :) .. Как получить этот ресурс? И в то же время есть рабочий тест.

URL url = Thread.currentThread (). GetContextClassLoader (). GetResource ("com / st / resource");

    FileInputStream inputStream = new FileInputStream(url.getFile());

java.io.FileNotFoundException: файл: /home/aaa/.m2/repository/com/st/module-1.1-SNAPSHOT.jar! / Com / st / resource (такого файла или каталога нет)

спасибо за помощь

1 Ответ

3 голосов
/ 23 февраля 2009

Я не совсем точно знаю, о чем идет речь в первой части, хотя я бы посоветовал не использовать "../" в пути к ресурсу.

Во второй части, если вы хотите загрузить ресурс, вы не должны использовать FileInputStream - вы должны использовать getResourceAsStream() вместо getResource().getFile(). Просто загрузите с этого InputStream - не всегда будет отдельный файл, который вы сможете загрузить с FileInputStream.

РЕДАКТИРОВАТЬ: есть два способа ссылки на ресурс: ClassLoader.getResource и Class.getResource (и эквиваленты с суффиксом AsStream). Разница между ними (единственное различие, о котором я знаю, хотя могут быть и другие), заключается в том, что Class.getResource рассматривает данный путь как относящийся к пакету класса, к которому вы обращаетесь. Так

ClassLoader.getResource("foo/bar/baz/test.xml")

эквивалентно

foo.bar.SomeClass.class.getResource("baz/test.xml");

Что касается разницы между Class.getClassLoader() и Thread.getContextClassLoader(), я не буду утверждать, что у меня хорошее понимание - я предлагаю вам задать это как отдельный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...