我对这个问题已经做了很多的研究。 到目前为止我没有运气。 基本上这段代码在我的Junittestingsrc \ 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 \testing\资源\ applicationContext.xml中
但是,在Linux上运行的Jenkins机器上,我得到了以下错误:
testSimple(com.project.ClientImplTest):IOException从文件[/ data / continuous / workspace / sonar / main_proj / data / continuous / workspace / sonar / main_proj / target / main / WEB-INF / test-classes / applicationContextparsingXML文档.XML]; 嵌套exception是java.io.FileNotFoundException:data / continuous / workspace / sonar / main_proj / target / main / WEB-INF / test-classes / applicationContext.xml(没有这样的文件或目录)
我已经validation文件/data/continuous/workspace/sonar/main_proj/target/main/WEB-INF/test-classes/applicationContext.xml确实存在。
为什么getResource()在Linux上找不到正确的path。 它似乎发现数据/连续/ …而不是/数据/连续/ …出于某种原因? 因此FileSystemXmlApplicationContext可能会返回一个exception,因为它找不到该文件。
谢谢
尝试添加一些调试输出。 URL有很好的toString()
方法。 因此,你会得到应用程序正在寻找文件的位置。
看起来你刚刚错过了斜线。 在您的资源加载器中将data/continuous/...
替换为/data/continuous/...
我的项目中有同样的问题 – 这是由路径中的空格造成的 – 要处理这种情况,您需要使用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'"); }
由于我没有足够的代表upvote或评论或什么,我会说我需要在这里说大声笑
Oifan是绝对正确的(阅读答案需要接受)。
詹金斯有同样的问题。 代码试图在测试期间访问文件,路径中有空格,导致FileNotFoundException
。 该文件绝对是在正确的位置。
我的测试也表明,空间是罪魁祸首。 我们只是要重命名詹金斯的项目,这将导致我们的目录结构中没有更多的空间。 然后我遇到了Oifan的回答。
将URL
从getResource()
转换为URI
并传递给File()
解决了我们的问题。
顺便说一句,这个问题是不是孤立的Linux。 我也看到了在Windows Jenkins从属上的这种行为。
其实詹金斯并没有抱怨applicationContext.xml
文件,但是这一个: data/continuous/workspace/sonar/main_proj/target/main/WEB-INF/test-classes/applicationContext-hibernate-junit.xml
为什么getResource()在Linux上找不到正确的路径。
我想你需要再看看你的代码和堆栈跟踪。
getResource()
方法不会抛出IOException
,也不抛出IOException
任何子类。 永远不会。
你看到的例外正在被别的东西抛出。 从消息中可以清楚地看出,引发异常的代码并不是在寻找名为“applicationContext.xml”的文件。
UPDATE
即使在你改正之后, getResource()
也不能导致FileNotFoundException
,这仍然是不可避免的事实。 您正在查看错误的代码。