こんにちは、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ファイルを右クリックすると、内部に表示されますが、私が間違っていることを誰もが知っていますか?
src/main/resources
のリソースはクラスパスのルートに配置されるため、次のようにリソースを取得する必要があります。
new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.txt")));
アーカイブのルートにconfig.txt
が見つかるので、mavenによって生成されたJAR/WARファイルを見て確認できます。
FileReaderは、ファイルシステム上のファイルから読み取ります。
おそらく、このようなものを使用して、クラスパスからファイルをロードするつもりでした
// this will look in src/main/resources before building and myjar.jar! after building.
InputStream is = MyClass.class.getClassloader()
.getResourceAsStream("config.txt");
または、読み込む前にjarからファイルを抽出できます。
Src/main/resourcesに配置したリソースは、ビルドプロセス中に、以下を使用してアクセスできるターゲット/クラスにコピーされます。
...this.getClass().getResourceAsStream("/config.txt");
Assemblyプラグインはファイルをクラスパスに配置すると思います。 JARの場所は、ディスクに表示される場所とは異なります。生成されたJARを解凍し、ファイルの場所を確認します。
ビルド後、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();
}
以下のタグをpom.xmlのタグに追加して、これらのリソースファイルを含めてターゲット/クラスフォルダーを構築できます。
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.ppk</include>
</includes>
</resource>
</resources>
src/main/resources/
をclasspath:
に直接置き換えることができます
したがって、この例では次の行を置き換えます。
new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));
この行で:
new BufferedReader(new FileReader(new File("classpath:config.txt")));