Eclipse 此.getClass().getClassLoader().getResource(“…”)和NullPointerException
我在EclipseHelios中创建了一个最小的maven项目,其中包含一个子模块 在src/test/resources文件夹中,我放了一个文件“install.xml”。在src/test/java文件夹中,我创建了一个包,其中包含一个类,可以: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");
@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)