我在eclipse helios中创建了一个带有单个子模块的最小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());
}
但是当我将代码作为junit 4单元测试运行时,我只得到一个NullPointerException。这之前已经运行了数百万次。有什么想法吗?
我已遵循本指南:
http://www.fuyun.org/2009/11/how-to-read-input-files-in-maven-junit/
但仍然会遇到同样的错误。
答案 0 :(得分:88)
使用时
this.getClass().getResource("myFile.ext")
getResource
将尝试查找与包相关的资源。
如果您使用:
this.getClass().getResource("/myFile.ext")
getResource
会将其视为绝对路径,只需调用类加载器,就像你已经完成的那样。
this.getClass().getClassLoader().getResource("myFile.ext")
您无法在/
路径中使用前导ClassLoader
的原因是因为所有ClassLoader
路径都是绝对路径,因此/
不是有效的第一个字符路径。
答案 1 :(得分:33)
tul,
.getClass().getResource(fileName)
时,它会考虑
fileName的位置与调用的位置相同
类。.getClass().getClassLoader().getResource(fileName)
时
认为fileName的位置是根 - 换句话说
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
答案 2 :(得分:18)
应为getResource("/install.xml");
资源名称与getClass()类所在的位置相关,例如如果您的测试为org/example/foo/MyTest.class
,那么getResource("install.xml")
会查看org/example/foo/install.xml
。
如果您的install.xml
位于src/test/resources
中,则它位于类路径的根目录中,因此您需要在资源名称前添加/
。
此外,如果它只是有时工作,那么可能是因为Eclipse已经清理了输出目录(例如target/test-classes
)并且资源只是从运行时类路径中丢失了。验证使用Eclipse的Navigator视图而不是Package explorer。如果文件丢失,请运行mvn package
目标。
答案 3 :(得分:4)
我在以下情况下遇到了同样的问题:
src/test/java
)中的包中。NullPointerException
的测试中构建失败。test-classes
文件夹,这解释了构建失败。NullPointerException
。我通过将资源文件放在test:src/test/resources
中的resources文件夹中,使用与源类相同的包结构来修复此问题。
BTW我使用了getClass().getResource(...)
答案 4 :(得分:4)
当eclipse运行测试用例时,它将在target / classes中查找文件而不是src / test / resources。当资源被保存时,eclipse应该将它从src / test / resources复制到目标/类,如果它已经改变但如果由于某种原因没有发生,那么你将得到这个错误。检查文件是否存在于目标/类中以查看是否存在问题。
答案 5 :(得分:1)
我想我确实遇到了和你一样的问题。我创建了一个简单的mvn项目,并使用“mvn eclipse:eclipse”来设置eclipse项目。
例如,我的源文件“Router.java”位于“java / main / org / jhoh / mvc”中。并且Router.java想要读取位于“java / main / org / jhoh / mvc / resources”中的文件“routes”
我在eclipse中运行“Router.java”,eclipse的控制台获得了NullPointerExeption。 我使用此设置设置pom.xml,以使所有* .class java字节码文件都位于构建目录中。
<build>
<defaultGoal>package</defaultGoal>
<directory>${basedir}/build</directory>
<build>
我去了“build / classes / org / jhoh / mvc / resources”目录,没有“路由”。 Eclipse DID NOT 将“routes”复制到“build / classes / org / jhoh / mvc / resources”
我认为您可以将“install.xml”复制到源代码目录中的* .class字节码目录 NOT 。
答案 6 :(得分:0)
我在使用Maven的项目上遇到了同样的问题。 我在这里如何解决它:我只是将资源(图像,音乐和其他东西)放在资源目录中:
src/main/resources
我也为资源目录中的包创建了相同的结构。 例如:
如果我上课了
com.package1.main
在资源目录中,我放了一个名称相同的包
com.package1.main
所以我用
getClass().getResource("resource.png");
答案 7 :(得分:0)
另外一件事就是为我解决了这个问题:
在Eclipse / Maven项目中,我在src/test/java
中使用了Java类,其中我使用this.getClass().getResource("someFile.ext");
模式在资源文件相同的src/test/resources
中查找资源资源源文件夹中的包位置,因为测试类位于测试源文件夹中。它仍然无法找到它们。
右键单击src/test/resources
源文件夹,构建路径,然后&#34;配置包含/排除过滤器&#34 ;;我添加了**/*.ext
的新包含过滤器,以确保我的文件没有被清除;我的测试现在可以找到他们的资源文件。
答案 8 :(得分:0)
如果您在 Netbeans(不是 Ant)中使用 Java Maven 项目,则将您的文件放置如下:
src
test
java
resources
install.xml
注意 resources
文件夹的位置。您还可以在资源中嵌套文件夹。然后您可以按如下方式访问您的文件,
URL url = this.getClass().getResource("/install.xml");