【问题标题】:What is the context of class.getRessource() (Java)?class.getResource() (Java) 的上下文是什么?
【发布时间】:2011-07-18 23:12:32
【问题描述】:

我正在建立一个开发环境,我有这段代码困扰着我:

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

问题是:url 为空。有问题的资源是位于与 java 文件完全相同的目录中的文件。这应该返回一个非空 url。

这个环境已经被很多人安装成功了,但是在我的机器上不行。

附加信息:

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

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java eclipse class junit classloader


【解决方案1】:

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

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

【讨论】:

  • 是的,这个问题来自 Eclipse 配置错误。我只是复制了执行目录中的文件,它可以工作。 (我刚刚花了 4 个小时试图做到这一点,没有一个肮脏的把戏,但失败了。上帝我讨厌 Eclipse)
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

  • Eclipse 工作目录确实是问题所在......而且 build.xml 只是过时/损坏了无论如何感谢您的帮助:D
【解决方案3】:

传递的类是什么?如果是 J2SE 类,则类加载器将是引导类加载器,不会定位应用程序资源。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 2012-08-27
      • 2011-04-24
      • 2011-01-23
      • 2011-05-11
      相关资源
      最近更新 更多