我在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。2这在以前已经工作了一百万次了。3有什么想法吗?
我遵循这个指南:
http://www.fuyun.org/2009/11/how-to-read-input-files-in-maven-junit/
但仍然会得到相同的错误。
9条答案
按热度按时间bxgwgixi1#
当您使用
字符串
getResource
将尝试查找与软件包相关的资源。如果您使用:用途:型
getResource
将把它当作一个绝对路径,并简单地调用类加载器,就像你做的那样。型
不能在
ClassLoader
路径中使用前导/
的原因是因为所有ClassLoader
路径都是绝对的,因此/
不是路径中有效的第一个字符。kuarbcqp2#
Tul,
.getClass().getResource(fileName)
时,它认为fileName的位置与调用类的位置相同。.getClass().getClassLoader().getResource(fileName)
时,它会将fileName的位置视为根文件夹-换句话说,就是bin
文件夹。资料来源:
字符串
输出量:
型
q5iwbnjs3#
应该是
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
目标。hgncfbus4#
当eclipse运行测试用例时,它会在target/classes而不是src/test/resources中查找该文件。当保存资源时,如果资源发生了变化,eclipse应该将其从src/test/resources复制到target/classes,但如果由于某种原因没有发生这种情况,那么你会得到这个错误。检查该文件是否存在于target/classes中,看看这是否是问题所在。
r7xajy2e5#
我有同样的问题与以下条件:
src/test/java
)中。NullPointerException
进行的测试中,构建失败了。test-classes
文件夹,这解释了生成失败的原因。NullPointerException
。我通过将资源文件放置在test:
src/test/resources
中的resources文件夹中,使用与源类相同的包结构来修复这个问题。顺便说一句,我用
getClass().getResource(...)
9rygscc16#
我想我确实遇到了和你一样的问题,我创建了一个简单的mvn项目,并使用“mvn eclipse:eclipse”来设置一个eclipse项目。
例如,我的源文件“Router.java“位于“java/main/org/jhoh/mvc”中。而Router.java要读取文件“routes”,该文件位于“java/main/org/jhoh/mvc/resources”中。
我在eclipse中运行“Router.java“,eclipse的控制台得到了NullPointerExeption。我用这个设置设置pom.xml,使所有 *.class java字节码文件都位于build目录中。
字符串
我去了目录“build/classes/org/jhoh/mvc/resources”,没有“routes”。Eclipse没有将“routes”复制到“build/classes/org/jhoh/mvc/resources”
我认为你可以将“install.xml”复制到你的 *.class字节码目录,而不是**在你的源代码目录。
2o7dmzc57#
我在使用Maven的一个项目中遇到了同样的问题。下面是我如何解决的:我只是把源代码(图像,音乐和其他东西)放在resources目录中:
字符串
我也为resources目录中的包创建了相同的结构。例如:
如果我的课上了
型
在resources目录中,我放置了一个同名的包
型
所以我用
型
vq8itlhq8#
还有一件事可以帮我解决:
在Eclipse / Maven项目中,我在
src/test/java
中有Java类,我使用this.getClass().getResource("someFile.ext");
模式在src/test/resources
中查找资源,其中资源文件位于resources source文件夹中的相同包位置,而测试类位于test source文件夹中。右键单击
src/test/resources
源文件夹,Build Path,然后“configure inclusion / exclusion filters”;我添加了一个新的**/*.ext
包含过滤器,以确保我的文件不会被擦除;我的测试现在可以找到它们的资源文件。2vuwiymt9#
如果您在Netbeans中使用Java Maven项目(而不是Ant),则将文件放置如下:
字符串
注意
resources
文件夹的位置。您也可以在资源中嵌套文件夹。然后您可以按以下方式访问文件:型
更多详情:https://stackoverflow.com/a/56008648/1942069