Dim*_*rov 6 java resources classloader
你好,
我有以下代码行:
InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml");
Run Code Online (Sandbox Code Playgroud)
我知道使用com/thinkplexx/lang/de/general.xml的jar在classpath中.
它工作在"以前的环境"下,即maven2 build.
现在,我评估maven3,它不起作用!我知道,如果我将代码更改为:
InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("com/thinkplexx/lang/de/general.xml");
Run Code Online (Sandbox Code Playgroud)
它工作得很好(我刚从资源路径中删除了第一个斜杠).
顺便说一句,我使用的是Linux.路径中的第一个斜杠通常意味着"从根目录",所以如果这个逻辑对于java资源加载也是合理的,那么第一个示例应该永远不会有效!
问题:第一个代码示例有问题,即使用/ com /而不是com /?这只是糟糕的代码还是意味着不同的东西?
谢谢!
这取决于您获取资源的方式.当您使用ClassLoader
as时:
InputStream stream= getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml");
Run Code Online (Sandbox Code Playgroud)
领先的'/'毫无意义.因此,正确的形式是"com/thinkplexx/lang/de/general.xml".
如果您使用"类",则如下所示:
InputStream stream= getClass().getResourceAsStream("/com/thinkplexx/lang/de/general.xml");
Run Code Online (Sandbox Code Playgroud)
你会得到不同的行为.该Class.getResourceAsStream
会考虑类,而领先"" 相对于包含该类的包.使用前导'.'指定的资源 绝对的,或相对于jar的根解析.
所以,如果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
Run Code Online (Sandbox Code Playgroud)
Maven2很松懈,允许最后一个表格.