ホームページ  >  記事  >  Java  >  JAR を実行するとクラスパス リソースで FileNotFoundException が発生するのはなぜですか?

JAR を実行するとクラスパス リソースで FileNotFoundException が発生するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 11:45:03188ブラウズ

Why Does My Classpath Resource Cause a FileNotFoundException When Running My JAR?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。