Spring-Boot-Ressource Nicht Gefunden werden, wenn über ausführbare Jar
wieder habe ich das Gesicht ein seltsames Problem und hoffe hier jemand helfen kann.
Ich habe eine spring-boot-backend-Modul, was funktioniert in eclipse gut und die Anwendung ausführbar ist beim Start von main in application.java. Alles in Ordnung.
Meiner Anwendung macht das importieren von Beispiel-Daten in die Datenbank über csv-Dateien was enthalten ist in src/main/resources Ordner. Wie bereits erwähnt, beim starten in eclipse funktioniert alles.
Jetzt würde ich mag, um es auszuführen als ausführbare jar-Datei die Anwendung gestartet und dann konnte nicht gestartet werden, weil es nicht finden können die csv-Dateien. Der Weg was es gibt, in denen es aussah für die Dateien, die korrekt ist und die csv-Dateien in der jar enthalten.
Dem Pom des Moduls sieht wie folgt aus:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>at.company.bbsng</groupId>
<artifactId>bbsng-import</artifactId>
<version>0.1.0-SNAPSHOT</version>
</parent>
<artifactId>bbsng-import-backend</artifactId>
<name>bbsng-import-backend</name>
<properties>
<start-class>at.company.bbsng.dataimport.Application</start-class>
</properties>
<dependencies>
<!-- SPRING ... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
<!-- EXCLUDE LOGBACK AND USE LOG4J -->
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- COMMONS ... -->
...
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Pfad zur csv-Dateien konfiguriert, in Anwesen-Dateien wie folgt:
# EXAMPLE PATH
csv.path=config/csv/
Den Teil des java-config-Datei ist wie folgt:
...
@Value("${csv.path}")
private String csvExamplePath;
@Bean
public Resource addressResource() {
return new ClassPathResource(csvExamplePath + CSV_ADDRESS);
}
...
In der jar-Dateien befinden sich im Pfad
\config\csv\
Stacktrace:
Caused by: java.io.FileNotFoundException: class path resource [config/csv/Company.csv] cannot be resolved to absolute file path because it does not reside in th
e file system: jar:file:/C:/Development/Projekte/bbsng/trunk/import/backend/target/bbsng-import-backend-0.1.0-SNAPSHOT.jar!/config/csv/Company.csv
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:207)
at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52)
at at.compax.bbsng.dataimport.app.source.company.CompanyGenerator.init(CompanyGenerator.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java
Wieder, funktioniert die Anwendung wie erwartet beim starten von eclipse, nur die ausführbaren jar-beschwert sich über fehlenden csv-Dateien, welche im jar bereits.
Keine Ahnung, wäre toll.
InformationsquelleAutor Michael Hegner | 2014-10-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay, schon fand ich das eigentliche problem und die Lösung.
Ersten, die Anwendung der richtigen Pfad zu den csv-Dateien, aber es gibt ein weiteres Problem bei der Verwendung einer ausführbaren jar, was ich gefunden unter folgenden link. Stackoverflow-Link
Bevor ich zum Problem mit der ausführbaren jar-verwendete ich folgende Lösung für die erste CSV-Datei (Problem ist getFile()):
Aber in ausführbare jar kann ich nicht verwenden, meine resource Datei, die ich brauche, es zu benutzen als stream, siehe link oben. So musste ich ändern mein code. Wenn Sie lieber mit nativen java, die Sie tun können, folgt:
Ich lieber mit frameworks und die Verwendung der apache commons wie folgt:
Also nur daran erinnern, nicht mit File() für die erste Ressource, verwenden Sie immer stream vermeiden, dass die Frage von Anfang 🙂
Hoffe, dass jemand hilft.
InformationsquelleAutor Michael Hegner
Dass ich auf diese Einschränkung zu und erstellt diese Bibliothek zu überwinden das Problem: spring-boot-jar-Ressourcen
Es im Grunde ermöglicht Ihnen die Registrierung eines custom ResourceLoader mit Spring Boot, dass Extrakte der classpath-Ressourcen aus dem GLAS als benötigt werden, transparent:
Mit, ResourceLoader, die Sie tun können
resource.getFile()
auf jeden classpath-Ressource.Ich wünschte, es war ein Weg dies zu tun ist im Frühjahr nativ, ohne sich auf ein anderes außerhalb der Bibliothek.
InformationsquelleAutor Ulises
Jetzt ich finden musste, xmlFiles in einer Ressource-Ordner aus einem GLAS und ähnliche Probleme haben wie hier beschrieben schon. Ich würde gerne meine Erkenntnisse und wie ich es geschafft habe zu arbeiten, vielleicht ist es hilfreich.
In einem Glas habe ich ein "db-Eingabe" - Ordner unter src/main/resources mit einer beliebigen Anzahl für xml-Dateien für den DB-Input. Meine Anwendung ist Frühling-Basiert:
InformationsquelleAutor Michael Hegner