2017-02-07 21 views
0

私は本当に奇妙な問題を抱えています私は論理的な説明がありません。本質的には、CamelCaseResourceBundleUpperCaseという名前で外部の.jarから読み取ろうとしています。例えば。 ResourceBundleMessageBundleと呼ばれ、MESSAGEBUNDLEで読んでいます。私が経験している奇妙な振る舞いを以下に説明します。大文字のResourceBundleが奇妙な動作を示しています

ResourceBundleProject

それは基本的に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:私はNetBeansResourceBundleDependencyプロジェクトを閉じて、(私は依存関係を構築しました)、再び同じ方法を実行し

が、それはキャメルケース方式で呼び出されたときに、ファイルを検索しますが、大文字の方法を使用してそれを見つけることができません。

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) 

ResourceBundlePropertyResourceBundleのJavaDocが本当に大文字で解決からは何も言及していません。しかし、それが1つのケースで動作する場合、他のケースではなぜですか?それが本当にうまくサポートされていない場合、カスタムClassLoaderはそれを解決できますか?

答えて

0

あなたの問題は、(私がjarファイルをファイルシステムと呼ぶかもしれない)根底にある "ファイルシステム"の大文字小文字の区別です。

PropertyResourceBundle.getBundle()は、適切な名前のプロパティファイルをロードする必要があります。つまり、コードによっては、ファイルシステム内またはjarファイル内でプロパティファイルを検索する必要があります。

ファイルシステムは大文字と小文字が区別されないため、 "READERMESSAGEBUNDLE.properties"を検索すると、 "ReaderMessageBundle.properties"という名前のファイルが検索されます。

Linuxファイルシステムとjarファイルでは大文字と小文字が区別されるため、「READERMESSAGEBUNDLE.properties」を検索すると何も見つかりません。


カスタムクラスローダーが問題を解決しますか? ClassLoader.getResource(String)メソッドであれば、READERMESSAGEBUNDLE.properties(存在する場合)のURLを返してくるだけでなく、そのクラスパスに含まれるすべてのリソースをリストし、それらのどれかが大文字小文字を区別しない名前と一致するかどうかをテストします。

関連する問題