eclipse this.getClass().getClassLoader().getResource(“...”)和NullPointerException

doinxwow  于 2023-11-18  发布在  Eclipse
关注(0)|答案(9)|浏览(150)

我在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/
但仍然会得到相同的错误。

bxgwgixi

bxgwgixi1#

当您使用

this.getClass().getResource("myFile.ext")

字符串
getResource将尝试查找与软件包相关的资源。如果您使用:用途:

this.getClass().getResource("/myFile.ext")


getResource将把它当作一个绝对路径,并简单地调用类加载器,就像你做的那样。

this.getClass().getClassLoader().getResource("myFile.ext")


不能在ClassLoader路径中使用前导/的原因是因为所有ClassLoader路径都是绝对的,因此/不是路径中有效的第一个字符。

kuarbcqp

kuarbcqp2#

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

q5iwbnjs

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目标。

hgncfbus

hgncfbus4#

当eclipse运行测试用例时,它会在target/classes而不是src/test/resources中查找该文件。当保存资源时,如果资源发生了变化,eclipse应该将其从src/test/resources复制到target/classes,但如果由于某种原因没有发生这种情况,那么你会得到这个错误。检查该文件是否存在于target/classes中,看看这是否是问题所在。

r7xajy2e

r7xajy2e5#

我有同样的问题与以下条件:

  • 资源文件与java源文件在同一个包中,在java源文件夹(src/test/java)中。
  • 我在命令行上用maven构建了这个项目,在用NullPointerException进行的测试中,构建失败了。
  • 命令行生成没有将资源文件复制到test-classes文件夹,这解释了生成失败的原因。
  • 当在命令行构建和测试之后去eclipse的时候,我也得到了eclipse中的NullPointerException
  • 当我清理项目(删除目标文件夹的内容)并在Eclipse中重建项目时,测试确实正确运行。这解释了为什么当您从一个干净的项目开始时,它会运行。

我通过将资源文件放置在test:src/test/resources中的resources文件夹中,使用与源类相同的包结构来修复这个问题。
顺便说一句,我用getClass().getResource(...)

9rygscc1

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>
    <defaultGoal>package</defaultGoal>
    <directory>${basedir}/build</directory>
<build>

字符串
我去了目录“build/classes/org/jhoh/mvc/resources”,没有“routes”。Eclipse没有将“routes”复制到“build/classes/org/jhoh/mvc/resources”
我认为你可以将“install.xml”复制到你的 *.class字节码目录,而不是**在你的源代码目录。

2o7dmzc5

2o7dmzc57#

我在使用Maven的一个项目中遇到了同样的问题。下面是我如何解决的:我只是把源代码(图像,音乐和其他东西)放在resources目录中:

src/main/resources

字符串
我也为resources目录中的包创建了相同的结构。例如:
如果我的课上了

com.package1.main


在resources目录中,我放置了一个同名的包

com.package1.main


所以我用

getClass().getResource("resource.png");

vq8itlhq

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包含过滤器,以确保我的文件不会被擦除;我的测试现在可以找到它们的资源文件。

2vuwiymt

2vuwiymt9#

如果您在Netbeans中使用Java Maven项目(而不是Ant),则将文件放置如下:

src
  test
    java
    resources
      install.xml

字符串
注意resources文件夹的位置。您也可以在资源中嵌套文件夹。然后您可以按以下方式访问文件:

URL url = this.getClass().getResource("/install.xml");


更多详情:https://stackoverflow.com/a/56008648/1942069

相关问题