getResourceAsStream терпит неудачу в новой среде? - PullRequest
6 голосов
/ 13 июля 2010

Алло,

У меня есть следующая строка кода:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml");

и я знаю, что jar с com / thinkplexx / lang / de / general.xml находится в пути к классам.

Работает в «предыдущей среде», которая является сборкой maven2.

Теперь я оцениваю maven3, и он не работает! Я знаю, что если я изменю код на:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("com/thinkplexx/lang/de/general.xml");

это прекрасно работает (я только что удалил первую косую черту из пути к ресурсу).

Кстати, я использую Linux. Первый слеш в пути обычно означает «из корневого каталога», поэтому, если эта логика также подходит для загрузки ресурсов Java, первый пример никогда не должен был работать !?

Вопросы: что-то не так с первым примером кода, то есть с / com / , а не с com / ? Это просто плохой код или это что-то другое?

спасибо!

1 Ответ

8 голосов
/ 13 июля 2010

Зависит от того, как вы получаете ресурс.Когда вы используете ClassLoader как:

InputStream stream= getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml");

Символ '/' не имеет смысла.Итак, правильной формой является «com / thinkplexx / lang / de / general.xml».

Если вместо этого вы используете «Класс», например:

InputStream stream= getClass().getResourceAsStream("/com/thinkplexx/lang/de/general.xml");

Вы получаетедругое поведение.Class.getResourceAsStream будет рассматривать классы без начального '.'быть относительно пакета, содержащего класс.Ресурсы, указанные с ведущими '.'являются абсолютными или разрешенными относительно корня банки.

Итак, если this является ссылкой на com.example.SomeThing, то ожидаемое поведение:

getClass().getResourceAsStream("/a/b/c.xml")  ==> a/b/c.xml
getClass().getResourceAsStream("a/b/c.xml")  ==> com/example/a/b/c.xml
getClass().getClassLoader().getResourceAsStream("a/b/c.xml")  ==> a/b/c.xml
getClass().getClassLoader().getResourceAsStream("/a/b/c.xml")  ==> Incorrect

Maven2 былбыть слабым и позволять последнюю форму.

...