Gitリポジトリからプロジェクトをインポートし、Mavenの性質をEclipseに追加しました。リソースフォルダーに、myconf.properties
という構成ファイルを追加しました。これで、Javaコードからこのファイルを開こうとすると、FileNotFoundException
が返されます。このファイルは、mavenがプロジェクトをコンパイルした後に生成されたtarget/classes
フォルダーにも存在します。
誰が何が問題なのか教えてもらえますか?このファイルをロードしようとする私のJavaコードは次のとおりです。
props.load(new FileInputStream("myconf.properties"));
ここで、props
はProperties
オブジェクトです。
誰もこの問題を解決する方法についていくつかのヒントを教えてもらえますか?
コンパイル後にファイルがtarget/classesの下に配置される場合、そのファイルはすでにビルドパスの一部であるディレクトリにあります。 src/main/resourcesディレクトリは、そのようなリソースのMavenのデフォルトディレクトリであり、Eclipse Mavenプラグイン(M2E)によってビルドパスに自動的に配置されます。そのため、プロパティファイルを移動する必要はありません。
もう1つのトピックは、そのようなリソースを取得する方法です。ビルドパスのリソースは、実行中のJavaプログラムのクラスパスに自動的に配置されます。これを考慮すると、常にクラスローダーでそのようなリソースをロードする必要があります。サンプルコード:
String resourceName = "myconf.properties"; // could also be a constant
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Properties props = new Properties();
try(InputStream resourceStream = loader.getResourceAsStream(resourceName)) {
props.load(resourceStream);
}
// use props here ...
src/main/resources
の下に配置し、次のようにロードする必要があると思います。
props.load(new FileInputStream("src/main/resources/myconf.properties"));
ロードしようとしている方法では、まずプロジェクトのベースフォルダーをチェックインします。 target/classes
にあり、そこからロードする場合は、次の手順を実行します。
props.load(new FileInputStream("target/classes/myconf.properties"));
単純なアプリケーションの場合、getSystemResourceAsStreamも使用できます。
try (InputStream inputStream = ClassLoader.getSystemResourceAsStream("config.properties"))..
Resources
フォルダーを右クリックし、Build Path > Add to Build Path
を選択します
このようなものを使用して、プロパティファイルを読み込みます。
final ResourceBundle bundle = ResourceBundle
.getBundle("properties/errormessages");
for (final Enumeration<String> keys = bundle.getKeys(); keys
.hasMoreElements();) {
final String key = keys.nextElement();
final String value = bundle.getString(key);
prop.put(key, value);
}
"myconf.properties"を相対パスとして使用している場合、Eclipseから実行すると考えています。ファイル構造は次のようになります。
ProjectRoot
src
bin
myconf.properties
ファイルパスで他のディレクトリが指定されていない場合、Eclipseはプロジェクトルートディレクトリでファイルを探します。
ClassLoader.getSystemClassLoader()
を使用する
サンプルコード:
Properties prop = new Properties();
InputStream input = null;
try {
input = ClassLoader.getSystemClassLoader().getResourceAsStream("conf.properties");
prop.load(input);
} catch (IOException io) {
io.printStackTrace();
}