私は本当に奇妙な問題を抱えています私は論理的な説明がありません。本質的には、CamelCase
ResourceBundle
をUpperCase
という名前で外部の.jar
から読み取ろうとしています。例えば。 ResourceBundle
はMessageBundleと呼ばれ、MESSAGEBUNDLEで読んでいます。私が経験している奇妙な振る舞いを以下に説明します。大文字のResourceBundleが奇妙な動作を示しています
それは基本的に2つの小さなプロジェクトで構成されています
は、次のような単純なプロジェクトのレイアウトを考えてみましょう。プロジェクトResourceBundleDependencyは、プロパティファイルのみで構成されています。プロジェクトResourceBundleReaderはプロパティファイルmain
で構成され、プロジェクトに依存しますResourceBundleDependency。
main
の方法では、BundleReader
の2つの方法で両方のResourceBundleを試してみました。以下のようなキャメルケースと大文字の両方:両方のプロジェクトは、NetBeansで開いていると私はmainメソッドを実行した場合
:#1を見つける
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"));
}
。すべて正常に動作し、以下が出力されます。
Internal Value
Internal Value
Dependency Value
Dependency Value
これは私が望む出力です。
検索#2:私はNetBeans
にResourceBundleDependencyプロジェクトを閉じて、(私は依存関係を構築しました)、再び同じ方法を実行し
が、それはキャメルケース方式で呼び出されたときに、ファイルを検索しますが、大文字の方法を使用してそれを見つけることができません。
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
問題になることはできません。 #3を見つける
は:
犯人はNetBeans
でなければなりません。代わりに、.jar
をビルドして代わりに実行します。 java -jar ResourceBundleReader-1.0-SNAPSHOT.jar
を呼び出すと、私は次の出力を得る:
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)
さらに悪くなりますか?もはやそれ自身の大文字の.jar
からプロパティファイルを読み込むことはできません。
見つける#4:犯人はMaven
でなければなりません
? .jar
をmavenを使用せずに作成し、依存関係jarをクラスパスに追加するだけで、問題は前と同じです。NetBeans
から正常に動作し、でも大文字で独自のResourceBundle
を読み取ることができません。
java -jar ResourceBundleReader2.jar
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 resourcebundlereader2.BundleReader.main(BundleReader.java:13)
ResourceBundleとPropertyResourceBundleのJavaDocが本当に大文字で解決からは何も言及していません。しかし、それが1つのケースで動作する場合、他のケースではなぜですか?それが本当にうまくサポートされていない場合、カスタムClassLoader
はそれを解決できますか?