this.getClass()。getClassLoader()。getResource(“…”)和NullPointerException
我已经在eclipse helios中创build了一个具有单个子模块的最小Maven项目。
在src / test / resources文件夹中,我放置了一个文件“install.xml”。 在文件夹src / test / java中,我创build了一个包含一个类的包:
@Test public void doit() throws Exception { URL url = this.getClass().getClassLoader().getResource("install.xml"); System.out.println(url.getPath()); }
但是当我作为一个junit运行代码4unit testing我只是得到一个NullPointerException。 这已经工作了一百万次。 有任何想法吗?
我遵循这个指南:
http://www.fuyun.org/2009/11/how-to-read-input-files-in-maven-junit/
但仍然得到相同的错误。
当你使用
this.getClass().getResource("myFile.ext")
getResource
将尝试查找与该包相关的资源。 如果你使用:
this.getClass().getResource("/myFile.ext")
getResource
会将其视为一个绝对path,只需调用类加载器,就像完成了一样。
this.getClass().getClassLoader().getResource("myFile.ext")
您无法在ClassLoader
path中使用前导/
的原因是因为所有ClassLoader
path都是绝对path,因此/
不是path中的有效第一个字符。
TUL,
- 当使用
.getClass().getResource(fileName)
它认为fileName的位置与调用类的位置相同。 - 当使用
.getClass().getClassLoader().getResource(fileName)
它认为.getClass().getClassLoader().getResource(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
它应该是getResource("/install.xml");
资源名称是相对于getClass()类所在的地方,例如,如果你的testing是org/example/foo/MyTest.class
那么getResource("install.xml")
将在org/example/foo/install.xml
查找。
如果您的install.xml
位于src/test/resources
,则它位于类path的根目录中,因此您需要在/前面加上资源名称。
另外,如果它只是有时候工作,那么可能是因为Eclipse已经清理了输出目录(例如target/test-classes
),并且资源在运行时类path中完全没有。 validation使用Eclipse的Navigator视图而不是Package Explorer。 如果文件丢失,请运行mvn package
目标。
我遇到了与以下情况相同的问题:
- 资源文件与java源文件夹(
src/test/java
)中的java源文件位于同一个包中。 - 我在命令行上使用maven构build项目,并且构build在
NullPointerException
的testing上失败。 - 命令行版本不会将资源文件复制到解释构build失败的
test-classes
文件夹中。 - 当在命令行构build之后去eclipse并在eclipse中重新运行testing时,我也在eclipse中得到了
NullPointerException
。 - 当我清理项目(删除目标文件夹的内容)并在Eclipse中重build项目时,testing确实运行正常。 这解释了为什么当你从一个干净的项目开始运行。
我通过将资源文件放在test资源文件夹中来解决这个问题: src/test/resources
使用与源类相同的包结构。
顺便说一句我用getClass().getResource(...)
当eclipse运行testing用例时,它会在target / classes而不是src / test / resources中查找文件。 当资源被保存时,eclipse应该将其从src / test / resources复制到目标/类,如果它已经改变了,但如果由于某种原因,这没有发生,那么你会得到这个错误。 检查目标/类中是否存在该文件,看看是否存在这个问题。
我想我遇到了和你一样的问题。 我创build了一个简单的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目录中。
<build> <defaultGoal>package</defaultGoal> <directory>${basedir}/build</directory> <build>
我去了目录“build / classes / org / jhoh / mvc / resources”,并没有“routes”。 Eclipse DID不会将“routes”复制到“build / classes / org / jhoh / mvc / resources”
我认为你可以将你的“install.xml”复制到* .class字节码目录中,而不是在你的源代码目录中。
我在与Maven合作的项目上遇到同样的问题。 在这里我是如何解决它的:我只是把资源(图像,音乐和其他东西)放在资源目录中:
src/main/resources
我也在资源目录中创build了与包相同的结构。 例如:
如果我的课上了
com.package1.main
在资源目录中,我放了一个具有相同名称的包
com.package1.main
所以我用
getClass().getResource("resource.png");
还有一件事要看我解决这个问题:
在Eclipse / Maven项目中,我在src/test/java
中使用了this.getClass().getResource("someFile.ext");
模式来查找src/test/resources
中的src/test/resources
,其中资源文件位于资源源文件夹中的相同包位置,因为testing类位于testing源文件夹中。 它仍然没有find他们。
右键单击src/test/resources
源文件夹,Build Path,然后“configuration包含/排除filter”; 我添加了一个**/*.ext
的新包含filter,以确保我的文件没有被擦掉; 我的testing现在可以find他们的资源文件。