我已经在互联网上对这个问题做了相当多的研究。到目前为止我运气不好。基本上,这段代码在我的Junit测试src\test\java\com\project\utils\MyTestCase.java的Windows上运行得很好:
URL urlApplicationContext = this.getClass().getClassLoader().getResource("applicationContext.xml");
final String[] paths = { urlApplicationContext.getFile()};
ApplicationContext ctx = new FileSystemXmlApplicationContext(paths);该文件位于:
\src\test\resources\applicationContext.xml
然而,在运行在linux上的Jenkins机器上,我得到了以下错误:
/data/continuous/workspace/sonar/main_proj/data/continuous/workspace/sonar/main_proj/target/main/WEB-INF/test-classes/applicationContext.xml;(com.project.ClientImplTest):从文件java.io.FileNotFoundException嵌套异常解析XML文档是java.io.FileNotFoundException: com.project.ClientImplTest(没有此类文件或目录)
我已经验证了文件/data/continuous/workspace/sonar/main_proj/target/main/WEB-INF/test-classes/applicationContext.xml确实存在。
为什么getResource()在Linux上找不到正确的路径。它似乎发现了数据/连续/.而不是/数据/连续/..。因为什么原因?因此,FileSystemXmlApplicationContext可能返回一个异常,因为它找不到该文件。
谢谢
发布于 2013-11-21 14:44:33
尝试添加一些调试输出。网址有很好的toString()方法。因此,您将得到应用程序正在寻找的文件。
看起来你一开始就漏掉了斜杠。在资源加载器中将data/continuous/...替换为/data/continuous/...。
发布于 2014-03-24 13:29:16
在我的项目中,我也遇到了同样的问题--它是由路径中的空格引起的--要处理这种情况,您需要使用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'");
}发布于 2014-07-23 14:05:20
因为我没有足够的代表来投票或发表评论,所以我会在这里说我需要说的话
Oifan是绝对正确的(阅读答案需要接受)。
在詹金斯身上也有同样的问题。在测试期间,代码试图访问文件,路径中有空格,导致FileNotFoundException。文件绝对在正确的位置。
我的测试也表明空间是罪魁祸首。我们打算在Jenkins中重命名这个项目,这样我们的目录结构中就不会有更多的空间了。然后我发现了Oifan的答案。
将URL从getResource()转换为URI并将其传递给File()也为我们解决了这个问题。
顺便说一下,这个问题并不是孤立于linux的。我也在Windows Jenkins奴隶身上看到过这种行为。
https://stackoverflow.com/questions/20123251
复制相似问题