【问题标题】:Classpath resource within jarjar 中的类路径资源
【发布时间】:2010-12-26 09:19:53
【问题描述】:

我有一个项目 A,其中包含一些 java 文件和一个类路径资源 R.txt。在项目中我使用 ClassLoader.getSystemResource("R.txt");检索 R.txt。

然后我有一个项目 B,其中包含项目 A 的 jar 文件。现在 getSystemResource("R.txt") 不会找到文本文件(是的,它仍然在 jar 文件的根目录中)。即使按照其他网站上的建议尝试“/R.txt”也没有用。有任何想法吗?

【问题讨论】:

    标签: java jar classpath resources


    【解决方案1】:

    使用getResource 而不是getSystemResource 来使用特定于给定类加载器而不是系统的资源。例如,尝试以下任一方法:

    URL resource = getClass().getClassLoader().getResource("R.txt");
    URL resource = Foo.class.getClassLoader().getResource("R.txt");
    URL resource = getClass().getResource("/R.txt");
    URL resource = Foo.class.getResource("/R.txt");
    

    在调用Class.getResource 而不是ClassLoader.getResource 时注意前导斜杠; Class.getResource 是相对于包含该类的包,除非您有前导斜杠,而 ClassLoader.getResource 始终是绝对的。

    【讨论】:

    • 太棒了。这完全解决了我的问题。感谢您的超快输入 // Johan
    • 一个更相关的问题:我们可以从这个 URL 资源中获取 InputStream,但是我们如何从返回的 URL 对象中创建一个 File 对象。我试图用“URLObject.toURI()”创建一个 URI 对象,并使用这个 URI 对象创建一个文件,不幸的是,它抛出了一个“URI 不是分层异常”。你能给我一些帮助吗?非常感谢。
    • @EnsomHodder:嗯,不确定 - 但并非所有资源都是文件 - 特别是,如果它在 jar 文件中,则不会。
    • 感谢您解释何时需要/
    • @Jeff:我已经回滚了编辑,因为Class.ClassLoader 不是类名。该方法在ClassLoader 类中。是的,您经常调用 Class.getClassLoader() 来获取类加载器,但调用仍然是ClassLoader.getResource...
    【解决方案2】:

    显然你的 JAR 没有被系统类加载器加载,所以getSystemResource() 不能工作。这应该有效:

    ClassFromProjectA.class.getClassLoader().getResource("R.txt")
    

    IMO 更方便的是将资源与使用它们的类放在同一个包中,因此您可以使用更短的

    ClassFromProjectA.class.getResource("R.txt")
    

    (或者,在该类中 getClass().getResource("R.txt")

    【讨论】:

      【解决方案3】:

      ClassLoader.getResource() 有效吗?目前,您只是指定要使用系统类加载器。

      【讨论】:

      • 像魅力一样工作。只需要使用正确的类加载器:)
      猜你喜欢
      • 2020-09-02
      • 1970-01-01
      • 2014-02-09
      • 2014-01-05
      • 2020-12-09
      • 2010-12-08
      • 2011-12-15
      • 2012-05-13
      • 2016-01-11
      相关资源
      最近更新 更多