我在自动执行的 .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
所以问题是:当 jar 在Program Files
目录中执行时,如何从 jar 加载资源包?
这是一个开源项目,完整的源代码在这里:https ://github.com/winder/Universal-G-Code-Sender