2012-04-16 31 views
35

こんにちは私のJavaアプリケーションのsrc/main/resourcesにある設定ファイルを使用しています。私はこのように私のクラスでそれを読んでいる:mavenでビルドした後、src/main/resourcesのリソースが見つかりません

new BufferedReader(new FileReader(new File("src/main/resources/config.txt"))); 

は、だから今、私はmvn assembly:assemblyを使用してのmavenでこれを構築しています。

src\main\resources\config.txt (The system cannot find the path specified) 

しかし、私は右の私の組み立てjarファイルをクリックしたとき、私はそれを見ることができます:私は私のアプリを実行したときにだから私はこのエラーを取得する

<plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <finalName>TestSuite</finalName> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
        <archive> 
         <manifest> 
          <addClasspath>true</addClasspath> 
          <mainClass>com.some.package.Test</mainClass> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 

:ここに私のpom.xmlでそのためのビットがあります誰かが私が間違っていることを知っている?

答えて

70

リソースはクラスパスのルートに置かれます、あなたは、などのリソースを取得する必要がありますので:あなたはあなたのアーカイブのルートにconfig.txtを見つけることができますようにMavenによって生成JAR/WARファイルを調べることで確認することができます

new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.txt"))); 

を。

+0

Mavenがこの違いを引き起こしたことを説明するテキストを少し回答に追加できますか?それは大きな助けになるでしょう。ありがとう。 – theJollySin

+2

前述のように、Mavenは 'src/main/resources'のリソースをクラスパスのルートに置くので、' src/main/resources'ディレクトリはJARファイルにありません。同様に '.class'ファイル'src/main/java'というディレクトリにありません。それは理にかなっていますか? – beny23

+7

静的コンテキストの場合は、「getClass()」の代わりに「Thread.currentThread()。getContextClassLoader()」を使用することもできます。 –

11

ファイルリーダーは、ファイルシステム上のファイルから読み取ります。

はおそらく、あなたはクラスパス

// this will look in src/main/resources before building and myjar.jar! after building. 
InputStream is = MyClass.class.getClassloader() 
        .getResourceAsStream("config.txt"); 

からファイルをロードするために、このようなものを使用することを意図しそれとも、それを読む前にjarファイルからファイルを抽出することもできます。

+0

src/main/resourcesが動作しない原因は、target/classesフォルダにコピーされ、jarファイルにパッケージされるためです。 – khmarbaise

+0

私はそれを訂正しました。ありがとうございました。あなたのクラスパスに '.'があるが、間違った理由でうまく動作する。すなわち、コピーではなくオリジナルを読み取る。 –

+0

@ beny23これは、ルート/トップレベルを常に参照する 'getClassLoader()'を使うよりも簡単かもしれません。 –

5

あなたはSRC /メイン/リソースを使用してアクセスすることができます/クラスをターゲットに、ビルドプロセス中にコピーされますに入れ資源:src/main/resourcesから

...this.getClass().getResourceAsStream("/config.txt"); 
+4

'this'は' Class'型ではないので、getClass()が必要です。 – beny23

+1

もちろん、あなたは正しいです。 – khmarbaise

1

私はアセンブリプラグインがクラスパス上のファイルを配置すると思います。 JARの場所は、ディスク上に表示される場所と異なる場合があります。生成されたJARを解凍し、そこにファイルがどこにあるか調べます。

+0

beny32の例が正しいアプローチです。 –

関連する問題