当jar位于受保护的Windows目录中时,无法获取jar资源

时间:2014-03-30 00:29:30

标签: java onejar

我在自动执行的.jar中有一个属性文件。实际上属性文件位于jar内的jar中(用一个jar包装)。如果我从桌面运行我的jar它工作正常,但当我把它放在Program Files目录中时它会失败。

这是我用来加载属性文件的代码:

public static void initialize(String language, String region) throws IOException {
    try {
        Locale locale = new Locale(language, region);
        bundle = ResourceBundle.getBundle("resources.MessagesBundle", locale);
    } catch (Exception e) {
        InputStream is = Localization.class.getClassLoader()
                .getResourceAsStream("resources/MessagesBundle_en_US.properties");
        bundle = new PropertyResourceBundle(is);
    }
}

我已经做了一些实验来尝试获得比“MissingResource”更好的错误消息,但到目前为止,它既可以工作也可以不工作。除非它在Program Files目录中,否则以下是一些有效的代码:

ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
InputStream is = contextClassLoader.getResourceAsStream(fileName);
if (is != null) {
    int avail = is.available();
    System.out.println("Available: " + avail);
} else {
    System.out.println("Can't open!!!!!");
}

这是ResourceBundle.getBundle的完整异常,其他函数只在无法加载文件时返回null:

Caused by: java.util.MissingResourceException: Can't find bundle for base name com.willwinder.universalgcodesender.i18n.MessagesBundle, locale en_US
at java.util.ResourceBundle.throwMissingResourceException(Unknown Source)
at java.util.ResourceBundle.getBundleImpl(Unknown Source)
at java.util.ResourceBundle.getBundle(Unknown Source)
at com.willwinder.universalgcodesender.i18n.Localization.initialize(Localization.java:39)
at com.willwinder.universalgcodesender.i18n.Localization.getString(Localization.java:44)
at com.willwinder.universalgcodesender.SettingsFactory.(Settings
Factory.java:65)
... 7 more

所以问题是:当在Program Files目录中执行jar时,如何从jar加载资源包?

这是一个开源项目,完整源代码可在此处获取:https://github.com/winder/Universal-G-Code-Sender

有问题的jar在这里:https://github.com/winder/builds/blob/master/UniversalGCodeSender/UniversalGcodeSender-v1.0.7.zip?raw=true

1 个答案:

答案 0 :(得分:1)

这与one-jar有某种关系,basejar.jar \- lib\ (jar dependencies) |- binlib\ (native dependencies, serial lib, opengl, etc) |- main\ \- main.jar (my code) \- resources\ \- MessagesBundle_en_US.properties 用于将本机文件和jar文件打包到自执行jar中。这些资源文件最初看起来像这样:

basejar.jar
 \- lib\ (jar dependencies)
 |- binlib\ (native dependencies, serial lib, opengl, etc)
 |- main\
 |   \- main.jar (my code)
 |- resources\
     \- MessagesBundle_en_US.properties

重新组织jar之后,资源目录位于容器jar的顶层我现在能够从受保护的目录中执行jar:

one-jar

我仍然不确定根本原因是什么,但它似乎是{{1}}中的一个错误。