使用getClassLoader()。getResource时,linux机器上的FileNotFoundException

时间:2013-11-21 14:14:20

标签: java linux

我已经在互联网上对这个问题做了很多研究。到目前为止我没有运气。基本上这段代码可以在Windows上使用我的Junit测试src \ test \ java \ com \ project \ utils \ MyTestCase.java:

URL urlApplicationContext = this.getClass().getClassLoader().getResource("applicationContext.xml");
final String[] paths = { urlApplicationContext.getFile()};
ApplicationContext ctx = new FileSystemXmlApplicationContext(paths);

此文件位于:

\ SRC \测试\资源\ applicationContext.xml中

然而,在Linux上运行的Jenkins机器上,我收到以下错误:

  

testSimple(com.project.ClientImplTest):解析XML的IOException   来自档案的文件   [/data/continuous/workspace/sonar/main_proj/data/continuous/workspace/sonar/main_proj/target/main/WEB-INF/test-classes/applicationContext.xml];   嵌套异常是java.io.FileNotFoundException:   数据/连续/工作区/声纳/ main_proj /目标/主/ WEB-INF /测试类/ applicationContext.xml中   (没有这样的文件或目录)

我已经确认文件/data/continuous/workspace/sonar/main_proj/target/main/WEB-INF/test-classes/applicationContext.xml确实存在。

为什么getResource()在Linux上找不到正确的路径。它似乎找到数据/连续/ ...而不是/ data / continous / ...出于某种原因?因此,FileSystemXmlApplicationContext可能会返回异常,因为它找不到该文件。

由于

5 个答案:

答案 0 :(得分:3)

我在项目中遇到了同样的问题 - 它是由路径中的空格引起的 - 要处理这种情况,你需要使用URL的 toURI()方法 - 执行以下操作:

ApplicationContext ctx;
URL urlApplicationContext = this.getClass().getClassLoader().getResource("applicationContext.xml");
if (urlApplicationContext != null) {
    File appCtxFile = new File(urlApplicationContext.toURI());
    ctx = new FileSystemXmlApplicationContext(new String[]{ appCtxFile.getAbsolutePath() });
} else {
    throw new RuntimeException("Cannot find XML file 'applicationContext.xml'");
}

答案 1 :(得分:1)

尝试添加一些调试输出。 URL有很好的toString()方法。因此,您将获得应用程序正在寻找文件的位置。

看起来你一开始就错过了斜线。在资源加载器中将data/continuous/...替换为/data/continuous/...

答案 2 :(得分:1)

由于我没有足够的代表进行upvote或评论或任何我会说我需要在这里说什么lol

Oifan绝对正确(阅读答案需要接受)。

詹金斯也有同样的问题。代码试图在测试期间访问文件,路径中有空格,导致FileNotFoundException。该文件肯定在正确的位置。

我的测试也表明这些空间是罪魁祸首。我们只是要在Jenkins中重命名该项目,这将导致我们的目录结构中不再有空格。然后我遇到了Oifan的回答。

URLgetResource()转换为URI并将其传递给File()也为我们解决了问题。

顺便说一句,问题不是孤立于linux。我也在Windows Jenkins奴隶上看到过这种行为。

答案 3 :(得分:0)

实际上Jenkins没有抱怨applicationContext.xml文件,但是这个:data/continuous/workspace/sonar/main_proj/target/main/WEB-INF/test-classes/applicationContext-hibernate-junit.xml

答案 4 :(得分:0)

  

为什么getResource()在Linux上找不到正确的路径。

我认为您需要再次查看代码和堆栈跟踪。

getResource()方法不会抛出IOExceptionIOException的任何子类。永远不会。

你看到的异常正在被别的东西抛出。从消息中可以清楚地看出,抛出该异常的代码也不是正在寻找一个名为“applicationContext.xml”的文件。

<强>更新

即使遵循了您的更正,getResource()无法导致FileNotFoundException仍然是一个不可忽视的事实。您正在查看错误的代码。