我有一个非常奇怪的问题,我没有任何合理的解释。实质上,我正试图通过外部CamelCase
的{{1}}名称来阅读ResourceBundle
UpperCase
。例如。 .jar
被称为 MessageBundle ,我用 MESSAGEBUNDLE 读取它。我正在经历的奇怪行为如下所述。
考虑以下简单的项目布局:
它基本上由2个小项目组成。项目 ResourceBundleDependency 仅包含属性文件。项目 ResourceBundleReader 由一个属性文件,一个ResourceBundle
方法组成,它依赖于项目 ResourceBundleDependency 。
在main
的{{1}}方法中,我尝试以两种方式读取两个ResourceBundle。 CamelCase和UpperCase都是这样的:
main
发现#1:
如果两个项目都在NetBeans中打开,我运行main方法。一切正常,打印如下:
BundleReader
这是我想要的输出。
查找#2:
当我关闭public static void main(String[] args) {
ResourceBundle readerBundle = PropertyResourceBundle.getBundle("ReaderMessageBundle", Locale.getDefault());
System.out.println(readerBundle.getString("READER.KEY"));
ResourceBundle upperReaderBundle = PropertyResourceBundle.getBundle("READERMESSAGEBUNDLE", Locale.getDefault());
System.out.println(upperReaderBundle.getString("READER.KEY"));
ResourceBundle depBundle = PropertyResourceBundle.getBundle("DependencyMessageBundle", Locale.getDefault());
System.out.println(depBundle.getString("DEPENDENCY.KEY"));
ResourceBundle upperDepBundle = PropertyResourceBundle.getBundle("DEPENDENCYMESSAGEBUNDLE", Locale.getDefault());
System.out.println(upperDepBundle.getString("DEPENDENCY.KEY"));
}
中的 ResourceBundleDependency 项目并再次运行相同的方法(我已经构建了依赖项)时,它以CamelCase方式调用时找到该文件但是可以'使用UpperCase方式找到它:
Internal Value
Internal Value
Dependency Value
Dependency Value
它不能是NetBeans
问题,因为CamelCase属性文件是正常找到的。
发现#3:
罪魁祸首必须是Internal Value
Internal Value
Dependency Value
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name DEPENDENCYMESSAGEBUNDLE, locale en_GB
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1564)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1387)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:845)
at com.mycompany.resourcebundlereader.BundleReader.main(BundleReader.java:19)
。相反,我将构建一个Classpath
并运行它。调用NetBeans
,我得到以下输出:
.jar
哪个更糟?它甚至无法再以大写形式从自己的java -jar ResourceBundleReader-1.0-SNAPSHOT.jar
读取属性文件。
发现#4:
罪魁祸首必须是Internal Value
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name READERMESSAGEBUNDLE, locale en_GB
at java.util.ResourceBundle.throwMissingResourceException(Unknown Source)
at java.util.ResourceBundle.getBundleImpl(Unknown Source)
at java.util.ResourceBundle.getBundle(Unknown Source)
at com.mycompany.resourcebundlereader.BundleReader.main(BundleReader.java:13)
?在不使用maven的情况下创建.jar
并仅将依赖关系jar添加到类路径中,问题与之前的问题相同。从Maven
开始工作正常,甚至无法在UpperCase中读取自己的.jar
:
NetBeans
ResourceBundle和PropertyResourceBundle JavaDoc并没有提到UpperCase解析的任何内容。但如果它在一个案例中起作用,为什么不在另一个案例中?如果支持不是很好,自定义ResourceBundle
可以解决吗?
答案 0 :(得分:0)
您的问题是基础"文件系统"的区分大小写。 (如果我可以将jar文件称为文件系统)。
PropertyResourceBundle.getBundle()
必须加载适当命名的属性文件。这意味着某些代码必须在文件系统或jar文件中查找属性文件。
在Windows上,文件系统不区分大小写,因此搜索" READERMESSAGEBUNDLE.properties"将找到名为" ReaderMessageBundle.properties"。
的文件linux文件系统和jar文件区分大小写,因此搜索" READERMESSAGEBUNDLE.properties"什么都不会发现。
自定义类加载器会解决您的问题吗?如果它的ClassLoader.getResource(String)
方法不仅返回READERMESSAGEBUNDLE.properties
的URL(如果它存在),而且列出其类路径中包含的所有资源并测试它们中的任何一个是否与名称大小写匹配,那么它可以不敏感的。