2011-12-30 9 views
0

私はJavaプロジェクトを持っていて、標準的なMavenアーキタイプを使ってdir構造を作りました。 それは次のようになります。実行時に/ src/main/resourcesにあるファイルが読み込みできないのはなぜですか?

|-src/main/java 
|-src/main/resources 
|-target/classes 
|- ... 

今私のクラスの一つは、いくつかの設定を読み込むことの.propertiesファイルを使用しています。私はそれをsrc/main/resourcesに置き、File propertiesFile = new File("./src/main/resources/starter.properties");を通して読みました。
私はEclipse実行構成を使用すると、すべて正常に動作します。しかし、最近私はjava some.package.Classを使用して私のコンソールから同じJavaクラスを起動しようとしました。.class-fileはtarget/classesにあります。メッセージを受け取ったので、./src/main/resources/starter.propertiesできませんでした。見つけられた。

私は間違っていますか? .propertiesファイルはresources-folderに置かれていないと思いますか、それとも別の方法でロードする必要がありますか?

答えて

4

前の2つの答えが正しいですが、私はもう少し文脈を与えたかったです。

このファイルは2か所にあります。これは/ src/main/resourcesから始まり、プロジェクトをビルドすると、Mavenはそれを/ target/classesにコピーします。

実行時に、ソースコード内のコピーにアクセスしないでください。それ以外の場合は、ソフトウェアを実行するためにソースコードにアクセスする必要があります。むしろ、あなたはあなたの成果物にあるコピーにアクセスすべきです。実行時には、クラスパス上で見つけたと安全に仮定できます。コンパイルされたクラスと同じ場所にあるので、クラスパスになければ、最初にプログラムを実行することはできませんでした。このため、他の回答者のようにgetResourceAsStream()を使用する必要があります。あなたがメインのsrc /であなたのMavenプロジェクトファイルをビルドする際に/、すでに与えられた2つの答えに拡大すること

(制作ソフトのため、私は物事のこれらの種類にアクセスするためのSpringのリソース抽象化をお勧めしませんけど。)

+0

洞察をいただきありがとうございます!私はリソースをコピーしてmavenでその部分を逃したように見えます。 :) – Zakum

2

実行時にこのファイルはクラスパスにあります。アクセスするにはClass.getResourceAsStream()を使用してください。

4

使用

YourClass.class.getResourceAsStream("/filename.properties"); 
3

リソースはクラスパスのルートにあるJARにコピーされます。 jar tvf *yourjarname*を実行した場合は、src/main/javaまたはsrc/main/resourcesフォルダーが存在しないことがわかります。 JAR経由で実行すると、それらのパス(現在は存在しないパス)から手動で読み込もうとすると失敗します。他の2つの回答には優れた提案があり、getResourceAsStreamメソッドを使用してファイルを読み込みます。これは非常に便利で使いやすいPropertiesオブジェクトのメソッドです。

 URL resourceURL = Thread.currentThread().getContextClassLoader() 
      .getResource(yourpropertyfilename); 

    Properties props = new Properties(); 
    props.load(resourceURL.openStream()); 
関連する問題