web-dev-qa-db-ja.com

Mavenでビルドした後、src / main / resourcesのリソースが見つかりません

こんにちは、Javaアプリケーションでsrc/main/resourcesの構成ファイルを使用しています。これを次のようにクラスで読み取ります。

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

だから今、私はmvn Assembly:assemblyを使用してmavenでこれを構築しています。これが私のpom.xmlのビットです:

<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>

そのため、アプリを実行するとこのエラーが発生します。

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

しかし、組み立てたjarファイルを右クリックすると、内部に表示されますが、私が間違っていることを誰もが知っていますか?

47

src/main/resourcesのリソースはクラスパスのルートに配置されるため、次のようにリソースを取得する必要があります。

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

アーカイブのルートにconfig.txtが見つかるので、mavenによって生成されたJAR/WARファイルを見て確認できます。

80
beny23

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

おそらく、このようなものを使用して、クラスパスからファイルをロードするつもりでした

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

または、読み込む前にjarからファイルを抽出できます。

11
Peter Lawrey

Src/main/resourcesに配置したリソースは、ビルドプロセス中に、以下を使用してアクセスできるターゲット/クラスにコピーされます。

...this.getClass().getResourceAsStream("/config.txt");
5
khmarbaise

Assemblyプラグインはファイルをクラスパスに配置すると思います。 JARの場所は、ディスクに表示される場所とは異なります。生成されたJARを解凍し、ファイルの場所を確認します。

1
Rostislav Matl

ビルド後、jarのリソースファイルはBOOT-INF/classesまたはtarget/classesフォルダーにあります。クラスパス、以下のメソッドを使用し、src/main/resourcesの下にファイルをメソッド呼び出しとして渡しますgetAbsolutePath( 「certs/uat_staging_private.ppk」)、このメソッドをUtilityクラスに配置することもでき、呼び出し元のThreadインスタンスはClassLoaderをロードしてクラスからリソースを取得します道。

 public String getAbsolutePath(String fileName) throws IOException {
      return Thread.currentThread().getContextClassLoader().getResource(fileName).getFile();
  }

enter image description hereenter image description here

以下のタグをpom.xmlのタグに追加して、これらのリソースファイルを含めてターゲット/クラスフォルダーを構築できます。

<resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.ppk</include>
            </includes>
        </resource>
</resources>
1
vijay

src/main/resources/classpath:に直接置き換えることができます

したがって、この例では次の行を置き換えます。

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

この行で:

new BufferedReader(new FileReader(new File("classpath:config.txt")));
0
Ahmed Elkoussy