首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >this.getClass().getClassLoader().getResource("...")和NullPointerException

this.getClass().getClassLoader().getResource("...")和NullPointerException
EN

Stack Overflow用户
提问于 2010-09-27 19:24:56
回答 6查看 191.8K关注 0票数 64

我在eclipse helios中创建了一个最小的maven项目,其中只有一个子模块。

在src/test/resources文件夹中,我放置了一个单独的文件"install.xml“。在文件夹src/test/java中,我创建了一个包含单个类的包,该类执行以下操作:

代码语言:javascript
复制
  @Test
  public void doit() throws Exception {
    URL url = this.getClass().getClassLoader().getResource("install.xml");
    System.out.println(url.getPath());

  }

但是,当我将代码作为JUnit4单元测试运行时,我只得到一个NullPointerException。这之前已经很好地工作过一百万次了。有什么想法吗?

我遵循了这个指南:

http://www.fuyun.org/2009/11/how-to-read-input-files-in-maven-junit/

但是仍然会得到相同的错误。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-18 03:44:06

当您使用

代码语言:javascript
复制
this.getClass().getResource("myFile.ext")

getResource将尝试查找与包相关的资源。如果您使用:

代码语言:javascript
复制
this.getClass().getResource("/myFile.ext")

getResource会将其视为绝对路径,并简单地调用类加载器,就像调用类加载器一样。

代码语言:javascript
复制
this.getClass().getClassLoader().getResource("myFile.ext")

不能在ClassLoader路径中使用前导/的原因是,所有ClassLoader路径都是绝对的,因此/不是路径中有效的第一个字符。

票数 101
EN

Stack Overflow用户

发布于 2010-09-27 19:58:23

应该是getResource("/install.xml");

资源名称与getClass()类所在的位置相关,例如,如果您的测试是org/example/foo/MyTest.class,那么getResource("install.xml")将在org/example/foo/install.xml中查找。

如果您的install.xmlsrc/test/resources中,那么它就在类路径的根目录中,因此您需要在资源名称前面加上/

此外,如果它只是偶尔工作,那么可能是因为Eclipse清理了输出目录(例如target/test-classes),而资源只是在运行时类路径中丢失了。验证是否使用Eclipse的Navigator视图,而不是Package explorer。如果缺少文件,则运行mvn package目标。

票数 21
EN

Stack Overflow用户

发布于 2013-10-30 14:41:00

当eclipse运行测试用例时,它将在target/classes而不是src/ test /resources中查找文件。在保存资源时,如果资源发生了更改,eclipse应该将其从src/test/resources复制到target/classes,但如果由于某些原因没有发生,则会出现此错误。检查目标/类中是否存在该文件,以确定这是否是问题所在。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3803326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档