我在一个自动执行的.jar中有一个属性文件。实际上,属性文件位于jar内的jar中(与one-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
有问题的罐子在这里:https://github.com/winder/builds/blob/master/UniversalGCodeSender/UniversalGcodeSender-v1.0.7.zip?raw=true
最佳答案
这与one-jar
有关,后者用于将本机文件和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了:
basejar.jar
\- lib\ (jar dependencies)
|- binlib\ (native dependencies, serial lib, opengl, etc)
|- main\
| \- main.jar (my code)
|- resources\
\- MessagesBundle_en_US.properties
我仍然不确定根本原因是什么,但这似乎是
one-jar
中的错误。关于java - 当jar位于 protected Windows目录中时,无法获取jar资源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22738778/