Heim  >  Artikel  >  Java  >  Warum verursacht meine Klassenpfadressource eine FileNotFoundException, wenn ich mein JAR ausführe?

Warum verursacht meine Klassenpfadressource eine FileNotFoundException, wenn ich mein JAR ausführe?

Barbara Streisand
Barbara StreisandOriginal
2024-11-02 11:45:03188Durchsuche

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

Klassenpfad-Ressource bei Ausführung als JAR nicht gefunden:

Bei der Ausführung von Java-Anwendungen, die als JARs (Java-Archivdateien) gepackt sind, wird versucht, den Klassenpfad zu laden Ressourcen, die Annotationen wie @Value verwenden, können zu FileNotFoundException-Fehlern führen. Während diese Ressourcen während der Entwicklung möglicherweise in der IDE (Integrated Development Environment) vorhanden sind, sind sie möglicherweise nicht über die JAR zugänglich.

Das Problem verstehen:

Classpath Ressourcen befinden sich standardmäßig im Verzeichnis src/main/resources des Projekts. Wenn die Anwendung über eine IDE ausgeführt wird, stehen diese Ressourcen der Anwendung direkt im Dateisystem zur Verfügung. Beim Erstellen einer JAR-Datei werden diese Ressourcen jedoch in der JAR-Datei gebündelt und sind nicht mehr als einzelne Dateien im Dateisystem vorhanden.

Zugriff auf Ressourcen aus JAR-Dateien:

Die im angegebenen Code verwendete Methode resources.getFile() erwartet, dass die Ressource als Datei im Dateisystem verfügbar ist. Da jedoch auf Klassenpfadressourcen in JAR-Dateien auf diese Weise nicht zugegriffen werden kann, wird ein Fehler ausgegeben. Um dieses Problem zu beheben, verwenden Sie stattdessen „resource.getInputStream()“. Diese Methode ruft den Inhalt der Ressource als Eingabestream ab, unabhängig von ihrem Speicherort.

Beispielcode:

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

Die Verwendung von getInputStream() stellt sicher, dass Klassenpfadressourcen verfügbar sind auf die zugegriffen werden kann, unabhängig davon, ob sie im Dateisystem vorhanden oder in einem JAR gebündelt sind.

Das obige ist der detaillierte Inhalt vonWarum verursacht meine Klassenpfadressource eine FileNotFoundException, wenn ich mein JAR ausführe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn