class.getResource()(Java)的上下文是什么?

时间:2011-07-18 23:12:33

标签: java eclipse class junit classloader

我正在设置一个开发环境,我有一些代码困扰我:

public static URI getResource(Class<?> cl, String resource) {
    URL url = cl.getResource(resource);
    //etc...
}

问题是:url为null。有问题的资源是一个位于java文件的确切目录中的文件。这应该返回一个非null url。

许多人已成功安装此环境,但它在我的计算机上无效。

其他信息:

  • getRessource()应该使用cl的classLoader。 (此classLoader) .toString()给出:“sun.misc.Launcher$AppClassLoader@11b86e7”
  • 此代码是在jUnit测试中,我在Windows 7上运行eclipse Indigo(linux / windows中不同文件上下文的问题?)

4 个答案:

答案 0 :(得分:3)

类加载器期望从与.class文件相同的目录获取资源文件,而不是.java文件。根据Eclipse项目的配置方式,这些可能是不同的目录。

通常,您的构建过程会在创建.class文件时将资源文件复制到输出目录,但在这种情况下,可能它没有?

答案 1 :(得分:1)

cl.getResource(resource)调用正在尝试在resource的类加载器的类路径中找到与cl字符串对应的资源。

这意味着resource需要是相对于应用程序类路径的路径。

方法调用返回null这一事实意味着类加载器无法找到所请求的资源。在运行单元测试之前,您需要检查资源是否被复制到正确的位置(由Eclipse或构建器)。

  

(linux / windows中不同文件上下文的问题?)

可能是资源名称区分大小写的问题。我怀疑它是否能为其他人正常运行,但值得检查。

此项目是否有build.xml个文件?尝试使用Ant从命令行运行测试。

此项目是否有pom.xml个文件?尝试使用mvn test从命令行运行测试。

答案 2 :(得分:0)

通过的课程是什么?如果它是J2SE类,则类加载器将是引导类加载器,并且不会找到应用程序资源。

答案 3 :(得分:0)

Class.getResource(String)将在与.class相同的包文件夹中查找资源。 ClassLoader.getResource(String)将在src文件夹中查找资源。 new File(String)将在src文件夹外查找资源。