web-dev-qa-db-ja.com

リソースディレクトリからプロパティファイルをロードできません

Gitリポジトリからプロジェクトをインポートし、Mavenの性質をEclipseに追加しました。リソースフォルダーに、myconf.propertiesという構成ファイルを追加しました。これで、Javaコードからこのファイルを開こうとすると、FileNotFoundExceptionが返されます。このファイルは、mavenがプロジェクトをコンパイルした後に生成されたtarget/classesフォルダーにも存在します。

誰が何が問題なのか教えてもらえますか?このファイルをロードしようとする私のJavaコードは次のとおりです。

props.load(new FileInputStream("myconf.properties"));

ここで、propsPropertiesオブジェクトです。

誰もこの問題を解決する方法についていくつかのヒントを教えてもらえますか?

51
artaxerxe

コンパイル後にファイルが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 ...
115
Seelenvirtuose

src/main/resourcesの下に配置し、次のようにロードする必要があると思います。

props.load(new FileInputStream("src/main/resources/myconf.properties"));

ロードしようとしている方法では、まずプロジェクトのベースフォルダーをチェックインします。 target/classesにあり、そこからロードする場合は、次の手順を実行します。

props.load(new FileInputStream("target/classes/myconf.properties"));
15
dev2d

単純なアプリケーションの場合、getSystemResourceAsStreamも使用できます。

try (InputStream inputStream = ClassLoader.getSystemResourceAsStream("config.properties"))..
6
rns

Resourcesフォルダーを右クリックし、Build Path > Add to Build Pathを選択します

3
Kevin Bowersox

このようなものを使用して、プロパティファイルを読み込みます。

        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);
        }
1
Karthik Prasad

"myconf.properties"を相対パスとして使用している場合、Eclipseから実行すると考えています。ファイル構造は次のようになります。

ProjectRoot
         src
         bin
         myconf.properties

ファイルパスで他のディレクトリが指定されていない場合、Eclipseはプロジェクトルートディレクトリでファイルを探します。

0
Paul Samsotha

ClassLoader.getSystemClassLoader()を使用する

サンプルコード:

Properties prop = new Properties();
InputStream input = null;
try {
    input = ClassLoader.getSystemClassLoader().getResourceAsStream("conf.properties");
    prop.load(input);

} catch (IOException io) {
    io.printStackTrace();
}
0
Deep