Eclipse 此.getClass().getClassLoader().getResource(“…”)和NullPointerException

Eclipse 此.getClass().getClassLoader().getResource(“…”)和NullPointerException,eclipse,maven-2,classloader,Eclipse,Maven 2,Classloader,我在EclipseHelios中创建了一个最小的maven项目,其中包含一个子模块 在src/test/resources文件夹中,我放了一个文件“install.xml”。在src/test/java文件夹中,我创建了一个包,其中包含一个类,可以: @Test public void doit() throws Exception { URL url = this.getClass().getClassLoader().getResource("install.xml");

我在EclipseHelios中创建了一个最小的maven项目,其中包含一个子模块

在src/test/resources文件夹中,我放了一个文件“install.xml”。在src/test/java文件夹中,我创建了一个包,其中包含一个类,可以:

  @Test
  public void doit() throws Exception {
    URL url = this.getClass().getClassLoader().getResource("install.xml");
    System.out.println(url.getPath());

  }
但是当我将代码作为JUnit4单元测试运行时,我只得到一个NullPointerException。这在过去的一百万次中都起到了很好的作用。有什么想法吗

我遵循了以下指南:


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

应该是
getResource(“/install.xml”)

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

如果您的
install.xml
位于
src/test/resources
中,则它位于类路径的根目录中,因此您需要在资源名称前面加上
/

此外,如果它只在某些时候起作用,那么可能是因为Eclipse清理了输出目录(例如,
目标/测试类
),并且运行时类路径中缺少资源。验证是否使用Eclipse的Navigator视图而不是PackageExplorer。如果文件丢失,请在使用时运行
mvn包
goal.

this.getClass().getResource("myFile.ext")
getResource
将尝试查找与包相关的资源。 如果您使用:

this.getClass().getResource("/myFile.ext")
getResource
将把它视为一个绝对路径,并简单地调用classloader,就像您这样做一样

this.getClass().getClassLoader().getResource("myFile.ext")
类加载器
路径中不能使用前导的
/
,原因是所有
类加载器
路径都是绝对路径,因此
/
不是路径中有效的第一个字符。

tul

  • 使用
    .getClass().getResource(文件名)
    时,它会考虑 文件名的位置与调用文件名的位置相同 班级
  • 当您使用
    .getClass().getClassLoader().getResource(文件名)
    时 认为文件名的位置是根,换句话说
    bin
    文件夹
资料来源:

package Sound;
public class ResourceTest {
    public static void main(String[] args) {
        String fileName = "Kalimba.mp3";
        System.out.println(fileName);
        System.out.println(new ResourceTest().getClass().getResource(fileName));
        System.out.println(new ResourceTest().getClass().getClassLoader().getResource(fileName));
    }
}
输出:

Kalimba.mp3
file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Sound/Kalimba.mp3
file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Kalimba.mp3

我有同样的问题,但有以下情况:

  • 资源文件与java源文件位于同一个包中,位于java源文件夹(
    src/test/java
    )中
  • 我在命令行上使用maven构建项目,在测试中使用
    NullPointerException
    构建失败
  • 命令行生成没有将资源文件复制到
    测试类
    文件夹,这解释了生成失败
  • 当在命令行构建之后进入eclipse并在eclipse中重新运行测试时,我还获得了eclipse中的
    NullPointerException
  • 当我清理项目(删除目标文件夹的内容)并在Eclipse中重建项目时,测试确实正确运行。这就解释了为什么当你开始一个干净的项目时它会运行
我通过使用与源类相同的包结构将资源文件放在test:
src/test/resources
中的resources文件夹中修复了这个问题


顺便说一句,我使用了
getClass()。getResource(…)

我在与Maven合作的项目中遇到了同样的问题。 我是如何修复的:我只是将源(图像、音乐和其他内容)放在参考资料目录中:

src/main/resources
我也为resources目录中的包创建了相同的结构。 例如:

如果我上课

com.package1.main
在resources目录中,我放置了一个同名的包

com.package1.main
所以我用

getClass().getResource("resource.png");

我想我确实遇到了和你一样的问题。我创建了一个简单的mvn项目,并使用“mvn eclipse:eclipse”设置了一个eclipse项目

例如,我的源文件“Router.java”位于“java/main/org/jhoh/mvc”中。java希望读取文件“routes”,该文件位于“java/main/org/jhoh/mvc/resources”中

我在eclipse中运行“Router.java”,eclipse的控制台获得了NullPointerExection。 我使用此设置设置pom.xml,使所有*.class java字节码文件都位于构建目录中

<build>
    <defaultGoal>package</defaultGoal>
    <directory>${basedir}/build</directory>
<build>

包裹
${basedir}/build
我去了目录“build/classes/org/jhoh/mvc/resources”,没有“routes”。Eclipse没有将“路由”复制到“build/classes/org/jhoh/mvc/resources”


我认为您可以将“install.xml”复制到源代码目录中的*.class字节码目录,而不是

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

另一个问题可以帮我解决:

<build>
    <defaultGoal>package</defaultGoal>
    <directory>${basedir}/build</directory>
<build>
在Eclipse/Maven项目中,我在
src/test/Java
中使用了Java类,其中使用了
this.getClass().getResource(“someFile.ext”)
pattern在
src/test/resources
中查找资源,其中资源文件位于资源源文件夹中的包位置,测试类位于测试源文件夹中。它仍然没有找到他们


右键单击
src/test/resources
source文件夹,构建路径,然后“配置包含/排除过滤器”;我添加了一个新的包含过滤器
***.ext
,以确保我的文件不会被删除;我的测试现在可以找到它们的资源文件。

我也尝试过:this.getClass().getClassLoader().getResource(“/install.xml”);没有帮助(我的其他所有读取资源的项目都不使用“/”前缀,它们工作正常)。我还尝试在pare上运行mvn clean安装(从命令行和eclipse)