我已经在互联网上对这个问题做了很多研究。到目前为止我没有运气。基本上这段代码可以在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可能会返回异常,因为它找不到该文件。
由于
答案 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的回答。
将URL
从getResource()
转换为URI
并将其传递给File()
也为我们解决了问题。
答案 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()
方法不会抛出IOException
或IOException
的任何子类。永远不会。
你看到的异常正在被别的东西抛出。从消息中可以清楚地看出,抛出该异常的代码也不是正在寻找一个名为“applicationContext.xml”的文件。
<强>更新强>
即使遵循了您的更正,getResource()
无法导致FileNotFoundException
仍然是一个不可忽视的事实。您正在查看错误的代码。