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

我对这个问题已经做了很多的研究。 到目前为止我没有运气。 基本上这段代码在我的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的回答。

URLgetResource()转换为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 ,这仍然是不可避免的事实。 您正在查看错误的代码。