getResourceAsStream перестал работать под новой средой?

Привет,

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

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

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

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

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

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

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

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

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

спасибо!

6
задан Dimitri Uwarov 13 July 2010 в 15:11
поделиться

1 ответ

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

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

Ведущее '/' не имеет смысла. Поэтому правильной формой будет "com/thinkplexx/lang/de/general.xml".

Если вместо этого вы используете 'Class', как в:

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 был небрежен и разрешал последнюю форму.

8
ответ дан 16 December 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: