【问题标题】:Reliable approach for loading resources in Java / JNLP在 Java / JNLP 中加载资源的可靠方法
【发布时间】:2011-03-18 13:16:29
【问题描述】:

我正在编写一个 Java 应用程序,它需要访问通过 JNLP 运行的 .jar 文件中的多个资源。

虽然应用程序在我的开发环境 (Eclipse) 中运行良好,但在通过 JNLP 执行时却无法运行,显然是因为它在 jar 中找不到资源文件。我检查了资源文件,资源肯定在那里。

我目前使用的代码如下:

 someclass.getResourceAsStream("/resources/somefile.png");

访问可与 JNLP 一起使用的 .jar 中的资源文件的正确方法是什么?

【问题讨论】:

  • 附注它也可以作为从命令行运行的可执行 jar 来运行....所以它似乎确实是 JNLP 特定的问题
  • 尝试使用上下文类加载器:Thread.currentThread().getContextClassLoader().getResourceAsStream("/resources/somefile.png")
  • 看起来很有希望(尽管出于某种原因,我必须删除路径中的前导“/”)。现在只是测试....
  • 当您通过类获取资源时,路径是相对于类解析的,除非您以“/”开头。当您通过 ClassLoader 获取它时,它始终被解析为绝对路径,并且不能以 '/' 开头。

标签: java resources jar packaging jnlp


【解决方案1】:

使用:this.getClass().getClassLoader().getResourceAsStream(name)
示例:myClass.getClass().getClassLoader().getResourceAsStream("resources/somefile.png")

两个提示:
1 - 使用您自己的 jar 文件中的类。如果使用另一个类 - 例如 Object - 失败
2 - 名称,即资源必须不带前导 '/'

【讨论】:

  • 谢谢罗曼!这似乎可行,我认为问题在于使用了不在我的 jar 文件中的 Java 类
【解决方案2】:

我在一个类似的问题上卡了一段时间,@Devon_C_Miller 的评论救了我(一旦我看到它,过了一段时间!),所以我想我会在这里重新复制它:

当您通过类获取资源时,路径是相对于类解析的,除非您以“/”开头。当您通过 ClassLoader 获取它时,它始终被解析为绝对路径,并且不能以 '/' 开头。

就我而言,对于位于 JAR 中的文件,我使用以下语法:/properties/config.properties:

//NO LEADING `/` EVEN IF IT IS AN ABSOLUTE PATH
private final static String CONFIG_FILE = "properties/config.properties";
InputStream resource = Configuration.class.getClassLoader().getResourceAsStream(CONFIG_FILE);

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多