JAR として実行するとクラスパス リソースが見つかりません:
JAR (Java アーカイブ ファイル) としてパッケージ化された Java アプリケーションを実行するときに、クラスパスをロードしようとします@Value などの注釈を使用するリソースでは、FileNotFoundException エラーが発生する可能性があります。これらのリソースは開発中に IDE (統合開発環境) に存在する可能性がありますが、JAR 内からはアクセスできない場合があります。
問題の理解:
クラスパスリソースは、デフォルトではプロジェクトの src/main/resources ディレクトリにあります。 IDE からアプリケーションを実行する場合、これらのリソースはファイル システム上のアプリケーションで直接利用できます。ただし、JAR を構築すると、これらのリソースは JAR ファイル内にバンドルされ、ファイルシステム上に個別のファイルとしては存在しなくなります。
JAR ファイルからのリソースへのアクセス:
指定されたコードで使用されているメソッド resource.getFile() は、リソースがファイル システム上のファイルとして利用可能であることを想定しています。ただし、JAR ファイル内のクラスパス リソースにはこの方法ではアクセスできないため、エラーがスローされます。この問題を解決するには、代わりに resource.getInputStream() を使用してください。このメソッドは、リソースの場所に関係なく、リソースのコンテンツを入力ストリームとして取得します。
コード例:
<code class="java">@Value("${message.file}") private Resource messageResource; public void run(String... arg0) throws Exception { // Read resource as input stream rather than file InputStream inputStream = messageResource.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { logger.debug("Line: " + line); } }</code>
getInputStream() を使用すると、クラスパス リソースを確実に取得できます。ファイルシステム上に存在するか、JAR 内にバンドルされているかに関係なくアクセスされます。
以上がJAR を実行するとクラスパス リソースで FileNotFoundException が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。