Привет,
у меня есть следующая строка кода:
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/? Это - просто плохой код, или это означает что-то другое?
спасибо!
Это зависит от того, как вы получаете ресурс. Когда вы используете 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 был небрежен и разрешал последнюю форму.