【问题标题】:Accessing JAR resources访问 JAR 资源
【发布时间】:2011-02-08 01:21:57
【问题描述】:

我有一个 jar 文件,其中包含我想要分发的资源(主要是缓存、日志记录等的配置)。

我对这些资源的相对路径有疑问,所以我做了我在另一个 stackoverflow 问题中找到的方法,它说这是一种有效的方法:

ClassInTheSamePackageOfTheResource.class.getResourceAsStream('resource.xml');

很遗憾,这不起作用。

有什么想法吗?谢谢!

PS:显然我不能使用绝对 路径,我想避免 环境变量(如果可能)

【问题讨论】:

  • 资源文件和class文件在同一个文件夹吗?这是一个独立的应用程序还是在 Web 服务器中运行?
  • 确实在同一个文件夹中。这是一个旨在包含在 Web 应用程序中的 jar,是的(但我认为这应该无关紧要)
  • 相关的搜索与给定类关联的资源的规则由定义类加载器实现。因此,您的 Web 应用程序的类加载器的行为可能会根据实现略有不同。只是一个想法。

标签: java jar resources embedded-resource relative-path


【解决方案1】:

我总是要通过getResourceAsStream 来解决这个问题。如果“resource.xml”在org/pablo/opus 中,我认为你想要这个:

Name.class.getResourceAsStream("org.pablo.opus.resource.xml");

【讨论】:

    【解决方案2】:

    resource.xml 在哪里找到?如果在源代码树的根目录中,请尝试在其前面加上 /。

    【讨论】:

    • 它不在源代码树的根目录上。它在一个包内
    • 因此将完全限定名称视为绝对路径,例如 com.me.and.u.effects.css 将作为 /com/me/and/u/effects.css 访问跨度>
    【解决方案3】:

    我通常存储文件和其他资源,然后将它们作为 URL 检索:

    URL url = MyClass.class.getResource("/design/someResource.png");
    

    在静态上下文中,或其他:

    URL url = getClass().getResource("/design/someResource.png");
    

    来自一个实例。

    上面的 sn-ps 假设 design 是 jar 中的顶级文件夹。一般来说,如果路径以“/”开头,则假定为绝对路径,否则为相对于类位置的路径。

    【讨论】:

      【解决方案4】:

      确保您的资源文件夹在项目设置中列为源文件夹。另外,请确保在构建 jar 时将资源文件夹设置为导出。

      您可以将 .zip 扩展名添加到您的 jar 文件中,然后打开它以确保您的资源包含在预期的位置。

      我总是使用这样的绝对路径:

      InputStream input = this.getClass().getResourceAsStream("/image.gif");
      

      使用绝对路径时,“/”是jar文件中的根文件夹,不是宿主机的根文件夹。

      【讨论】:

      • 确实,我使用了你描述的(jar)绝对路径方法,它有效!不知道为什么它没有与相对的人一起玩......但足够好就足够好了
      猜你喜欢
      • 2016-12-29
      • 2012-05-11
      • 2012-11-28
      • 2020-01-31
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多