Spring-Boot Ressource introuvable lors de l'utilisation de Jar exécutable
de nouveau, je fais face à un étrange problème et espère que quelqu'un ici peut vous aider.
J'ai un ressort de démarrage module backend, ce qui fonctionne dans eclipse et l'application est exécutable lors du démarrage principal dans application.java. Tout d'amende.
Mon application qui rend l'importation de données de l'exemple de base de données au format csv fichiers de ce qui est inclus dans src/main/resources dossier. Comme mentionné, lors du démarrage dans eclipse tout fonctionne.
Maintenant, je voudrais exécuter en tant que fichier exécutable jar, l'application commence à démarrer et puis il n'a pas pu démarrer, car il ne peut pas trouver les fichiers csv. Le chemin qu'il imprime, où il a regardé pour les fichiers, est correcte et les fichiers csv sont dans le pot inclus.
Le Pom du module ressemble comme suit:
<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>
Chemin d'accès à un chier csv fichiers sont configurés dans propery fichiers comme suit:
# EXAMPLE PATH
csv.path=config/csv/
La partie de java fichier de configuration est comme suit:
...
@Value("${csv.path}")
private String csvExamplePath;
@Bean
public Resource addressResource() {
return new ClassPathResource(csvExamplePath + CSV_ADDRESS);
}
...
Dans le bocal les fichiers sont situés dans le chemin
\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
Encore une fois, l'application fonctionne comme prévu lors du démarrage à partir d'eclipse, seul exécutable jar se plaint de manque csv fichiers, quels sont dans le bocal déjà.
Aucune idée serait génial.
OriginalL'auteur Michael Hegner | 2014-10-03
Vous devez vous connecter pour publier un commentaire.
Bon, déjà j'ai trouvé le vrai problème et la solution.
Tout d'abord, l'utilisation de l'application le bon chemin pour les fichiers csv, mais il y a un autre problème lors de l'utilisation d'un fichier exécutable jar ce que j'ai trouvé sous ce lien. Stackoverflow-Lien
Avant d'en arriver au problème avec l'exécutable jar j'ai utilisé la solution suivante pour obtenir de Fichier CSV (Question est getFile()):
Mais dans exécutable jar je ne peux pas utiliser mes ressources, j'ai besoin de l'utiliser comme stream, voir le lien fourni ci-dessus. Donc j'avais besoin de changer mon code. Si vous préférez l'utilisation de java en natif, vous pouvez le faire suit:
Je préfère utiliser des cadres et de l'utilisation d'apache commons comme suit:
Donc, rappelez-vous juste, ne pas utiliser de Fichier() pour obtenir les ressources, toujours utiliser le volet afin d'éviter que la question du début 🙂
Espère que ça aide quelqu'un.
OriginalL'auteur Michael Hegner
J'ai rencontré cette limitation trop et a créé cette bibliothèque pour surmonter le problème: spring-boot-jar-ressources
Qu'il est fondamentalement vous permet de vous inscrire personnalisé ResourceLoader avec Spring Boot qui extrait le classpath de ressources à partir du POT en tant que de besoin, de manière transparente:
Avec qui ResourceLoader vous pouvez faire
resource.getFile()
sur tout le classpath de ressources.Je souhaite qu'il y avait un moyen de le faire dans le Printemps de manière native, sans dépendre d'une autre à l'extérieur de la bibliothèque.
OriginalL'auteur Ulises
Maintenant j'ai besoin de trouver xmlFiles dans un dossier de ressources à partir d'un BOCAL et qui sont confrontés aux mêmes problèmes décrits ici déjà. Je voudrais partager mes découvertes et comment je l'ai eu à travailler, peut-être qu'il est utile.
Dans un bocal j'ai "db-entrée" dans le dossier src/main/resources avec n'importe quel nombre de Fichiers xml pour DB-Entrée. Ma demande est le Printemps:
OriginalL'auteur Michael Hegner