【问题标题】:Loading with ResourceBundle from inside a jar从 jar 中使用 ResourceBundle 加载
【发布时间】:2012-06-06 09:41:17
【问题描述】:

我已经看到了一些关于如何通过 getResourceAsStream 在 jar 中加载特定文件的答案,我可以管理它。 但是,我正面临一些非常具体的问题,我无法在论坛上找到有关此问题的答案。

这里是配置:

我有一个 jar 文件,其中有一个 conf 目录,其中包含 2 个属性文件 messages_en_US.propertiesmessages_fr_FR.properties。加载此类资源的经典方法是使用

ResourceBundle.getBundle("messages", java.util.Locale.getDefault());

如果文件在磁盘上,在程序类路径引用的目录中,则可以正常工作。但我不知道如何管理组合使用 ResourceBundle.getBundle 和使用 jar 中的资源。 确实,因为我看不到任何通过 getResourceAsStream 的桥梁(或者这意味着我自己管理语言环境以指定整个资源文件名,这不是很聪明)。

【问题讨论】:

  • 你在 JAR 中哪里有那个文件?如果它留在 JAR 中,则意味着您在类路径中拥有它,并且使用 ResourceBundle.getBundle 正常加载它应该没有问题
  • 我有同样的问题,我在 jar 文件中有一个属性资源,但该 jar 文件不在程序类路径中。我阅读了 PropertyResourceBundle 的 javadoc,我知道我可以使用 inputstream 来做到这一点,但 inputstream 意味着 IO 它每次都会读取文件并且我失去了默认的 ResourceBundle 缓存。有没有办法指示 ResourceBundle 类从其类路径之外的资源中获取包?
  • ResourceBundle.Control 也可以实现自定义,但似乎有点矫枉过正,最好找到将属性文件放在类路径中的方法。

标签: java jar resourcebundle


【解决方案1】:

如果它在 jar 内的 conf 目录中,那么您尝试加载的包的包是 conf,您应该使用

ResourceBundle.getBundle("conf.messages", java.util.Locale.getDefault());

The javadoc 说:

baseName - the base name of the resource bundle, a fully qualified class name

【讨论】:

  • JAR 文件并不意味着它必须在类路径中。我认为原作者试图说明如何在类路径之外访问资源包。一种方法是将 PropertyResourceBundle 与 InputStream 一起使用,但随后您会丢失缓存,并且无论何时执行捆绑,您都必须执行新的捆绑。我有同样的问题,我有一个不在类路径中的资源。
【解决方案2】:

你试过了吗?

ResourceBundle.getBundle("conf/messages", java.util.Locale.getDefault());

【讨论】:

    【解决方案3】:

    ResourceBundle 总是搜索一个属性文件,所以,如果你运行:

    ResourceBundle.getBundle("messages", java.util.Locale.getDefault());
    

    ResourceBundle 将在您的类路径中搜索“messages.properties”。

    【讨论】:

      【解决方案4】:

      假设文件messages.properties 是某个xyz.jar 的一部分,它已经在您要使用它的项目的类路径中。该文件在jar中的打包如下:

      src
         |main
             |resources
                  |com
                      |xyz
                         ....|message.properties 
      

      要读取这个文件:

      import java.util.ResourceBundle;
      

      ....

      ResourceBundle.getBundle("com.xyz.resources.messages", Locale.getDefault());
      

      谢谢

      【讨论】:

        猜你喜欢
        • 2017-03-22
        • 2012-11-15
        • 2011-07-18
        • 1970-01-01
        • 2018-08-31
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 2017-01-23
        相关资源
        最近更新 更多