Ayant ce problème à la fois dans Spring Boot 1.1.5 et 1.1.6 - Je charge une ressource de chemin de classe à l'aide d'une annotation @Value, qui fonctionne très bien lorsque j'exécute l'application à partir de STS (3.6.0, Windows). Cependant, lorsque j'exécute un package mvn puis que j'essaye d'exécuter le fichier jar, j'obtiens des exceptions FileNotFound.
La ressource, message.txt, se trouve dans src / main / resources. J'ai inspecté le pot et vérifié qu'il contient le fichier "message.txt" au niveau supérieur (même niveau que application.properties).
Voici l'application:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements CommandLineRunner {
private static final Logger logger = Logger.getLogger(Application.class);
@Value("${message.file}")
private Resource messageResource;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... arg0) throws Exception {
// both of these work when running as Spring boot app from STS, but
// fail after mvn package, and then running as java -jar
testResource(new ClassPathResource("message.txt"));
testResource(this.messageResource);
}
private void testResource(Resource resource) {
try {
resource.getFile();
logger.debug("Found the resource " + resource.getFilename());
} catch (IOException ex) {
logger.error(ex.toString());
}
}
}
L'éxéption:
c:\Users\glyoder\Documents\workspace-sts-3.5.1.RELEASE\classpath-resource-proble
m\target>java -jar demo-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.1.5.RELEASE)
2014-09-16 08:46:34.635 INFO 5976 --- [ main] demo.Application
: Starting Application on 8W59XV1 with PID 5976 (C:\Users\glyo
der\Documents\workspace-sts-3.5.1.RELEASE\classpath-resource-problem\target\demo
-0.0.1-SNAPSHOT.jar started by glyoder in c:\Users\glyoder\Documents\workspace-s
ts-3.5.1.RELEASE\classpath-resource-problem\target)
2014-09-16 08:46:34.640 DEBUG 5976 --- [ main] demo.Application
: Running with Spring Boot v1.1.5.RELEASE, Spring v4.0.6.RELEA
SE
2014-09-16 08:46:34.681 INFO 5976 --- [ main] s.c.a.AnnotationConfigA
pplicationContext : Refreshing org.springframework.context.annotation.Annotation
ConfigApplicationContext@1c77b086: startup date [Tue Sep 16 08:46:34 EDT 2014];
root of context hierarchy
2014-09-16 08:46:35.196 INFO 5976 --- [ main] o.s.j.e.a.AnnotationMBe
anExporter : Registering beans for JMX exposure on startup
2014-09-16 08:46:35.210 ERROR 5976 --- [ main] demo.Application
: java.io.FileNotFoundException: class path resource [message.
txt] cannot be resolved to absolute file path because it does not reside in the
file system: jar:file:/C:/Users/glyoder/Documents/workspace-sts-3.5.1.RELEASE/cl
asspath-resource-problem/target/demo-0.0.1-SNAPSHOT.jar!/message.txt
2014-09-16 08:46:35.211 ERROR 5976 --- [ main] demo.Application
: java.io.FileNotFoundException: class path resource [message.
txt] cannot be resolved to absolute file path because it does not reside in the
file system: jar:file:/C:/Users/glyoder/Documents/workspace-sts-3.5.1.RELEASE/cl
asspath-resource-problem/target/demo-0.0.1-SNAPSHOT.jar!/message.txt
2014-09-16 08:46:35.215 INFO 5976 --- [ main] demo.Application
: Started Application in 0.965 seconds (JVM running for 1.435)
2014-09-16 08:46:35.217 INFO 5976 --- [ Thread-2] s.c.a.AnnotationConfigA
pplicationContext : Closing org.springframework.context.annotation.AnnotationCon
figApplicationContext@1c77b086: startup date [Tue Sep 16 08:46:34 EDT 2014]; roo
t of context hierarchy
2014-09-16 08:46:35.218 INFO 5976 --- [ Thread-2] o.s.j.e.a.AnnotationMBe
anExporter : Unregistering JMX-exposed beans on shutdown
la source
classpath:filename
pour que le fichier de keystore puisse être lu à partir du fichier jar.Si vous utilisez le framework Spring, lire
ClassPathResource
dans unString
est assez simple en utilisant le framework SpringFileCopyUtils
:la source
Si vous souhaitez utiliser un fichier:
la source
lorsque le projet de démarrage de printemps s'exécute en tant que jar et que vous avez besoin de lire un fichier dans le chemin de classe, je l'implémente par le code ci-dessous
la source
J'ai créé une classe ClassPathResourceReader de manière java 8 pour faciliter la lecture des fichiers à partir du chemin de classe
Utilisation:
la source
J'ai également rencontré cette limitation et j'ai créé cette bibliothèque pour résoudre le problème: spring-boot-jar-resources Cela vous permet essentiellement d'enregistrer un ResourceLoader personnalisé avec Spring Boot qui extrait les ressources de chemin de classe du JAR au besoin, de manière transparente.
la source
la source
Jersey doit être des bocaux déballés.
la source
la source
Sur la base de la réponse d'Andy, j'ai utilisé ce qui suit pour obtenir un flux d'entrée de tous les YAML sous un répertoire et des sous-répertoires dans les ressources (notez que le chemin passé ne commence pas par
/
):la source
Je suis également coincé dans une situation similaire mais pas exactement similaire, je voulais lire un fichier JSON à partir du dossier de ressources.src / main / resources Par conséquent, j'ai écrit un code comme celui-ci ci-dessous.
Il existe plusieurs méthodes répertoriées ici pour lire un fichier de chemin de classe dans Spring Boot Application.
@Value ("classpath: test.json") ressource de ressource privée;
ressource de ressource privée;
Maintenant, ce code fonctionne parfaitement une fois que je l'ai exécuté en utilisant, mvn: spring-boot: run, mais dès que je construis et empaquette l'application en utilisant maven et que je l'exécute comme un simple fichier exécutable, j'obtiens une exception. Allons-y et trouvons la solution maintenant.
En utilisant InputStream, j'ai trouvé la réponse dans mon cas: -
Spring fonctionne sur le concept de Fat Jar, il est donc vraiment difficile car il se comporte différemment dans Eclipse et pendant que vous exécutez comme un pot.
la source
Concernant le message d'erreur d'origine
Le code suivant peut être utile pour trouver la solution au problème de chemin:
Avec cela, vous pouvez déterminer où l'application attend le fichier manquant. Vous pouvez l'exécuter dans la méthode principale de votre application.
la source