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") 

您无法在ClassLoaderpath中使用前导/的原因是因为所有ClassLoaderpath都是绝对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他们的资源文件。