Tout
J'ai créé un fichier jar avec le MANIFEST.MF suivant à l'intérieur:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.6.0_25-b06 (Sun Microsystems Inc.)
Main-Class: my.Main
Class-Path: . lib/spring-core-3.2.0.M2.jar lib/spring-beans-3.2.0.M2.jar
À sa racine, il y a un fichier appelé my.config qui est référencé dans mon spring-context.xml comme ceci:
<bean id="..." class="...">
<property name="resource" value="classpath:my.config" />
</bean>
Si j'exécute le jar, tout semble bien sauf le chargement de ce fichier spécifique:
Caused by: java.io.FileNotFoundException: class path resource [my.config] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/work/my.jar!/my.config
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:205)
at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52)
at eu.stepman.server.configuration.BeanConfigurationFactoryBean.getObject(BeanConfigurationFactoryBean.java:32)
at eu.stepman.server.configuration.BeanConfigurationFactoryBean.getObject(BeanConfigurationFactoryBean.java:1)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
... 22 more
- les classes sont chargées depuis l'intérieur du fichier jar
- spring et d'autres dépendances sont chargées à partir de pots séparés
- le contexte de printemps est chargé (nouveau ClassPathXmlApplicationContext ("spring-context / applicationContext.xml"))
- my.properties est chargé dans PropertyPlaceholderConfigurer ("classpath: my.properties")
- si je place mon fichier .config en dehors du système de fichiers et que je change l'URL de la ressource en 'file:', tout semble aller bien ...
Des conseils?
Je sais que cette question a déjà reçu une réponse. Cependant, pour ceux qui utilisent Spring Boot, ce lien m'a aidé - https://smarterco.de/java-load-file-classpath-spring-boot/
Cependant,
resourceLoader.getResource("classpath:file.txt").getFile();
cela causait ce problème et le commentaire de sbk:m'a aidé à comprendre pourquoi utiliser
getInputStream()
place. Ça marche pour moi maintenant!Merci!
la source
Dans le package spring jar, j'utilise new
ClassPathResource(filename).getFile()
, ce qui lève l'exception:Mais utiliser new
ClassPathResource(filename).getInputStream()
résoudra ce problème. La raison est que le fichier de configuration dans le fichier jar n'existe pas dans l'arborescence de fichiers du système d'exploitation, il doit donc être utiliségetInputStream()
.la source
J'ai eu un problème similaire lors de l'utilisation de Tomcat6.x et aucun des conseils que j'ai trouvés n'aidait. A la fin j'ai supprimé
work
dossier (de Tomcat) et le problème a disparu.Je sais que c'est illogique mais à des fins de documentation ...
la source
La réponse de @sbk est la façon dont nous devrions le faire dans un environnement spring-boot (à part @Value ("$ {classpath *:})), à mon avis. Mais dans mon scénario, cela ne fonctionnait pas si l'exécution de la version autonome jar .. peut-être que j'ai fait quelque chose de mal.
Mais cela peut être une autre façon de faire cela,
la source
J'avais un problème plus complexe parce que j'ai plus d'un fichier avec le même nom, l'un est dans le pot principal de Spring Boot et d'autres sont dans des pots à l'intérieur du pot de graisse principal. Ma solution consistait à obtenir toutes les ressources du même nom et à obtenir ensuite celle dont j'avais besoin en filtrant par nom de package. Pour obtenir tous les fichiers:
la source
J'avais un problème de chargement récursif des ressources dans mon application Spring, et j'ai constaté que le problème était que je devrais utiliser
resource.getInputStream
. Voici un exemple montrant comment lire de manière récursive tous les fichiersconfig/myfiles
qui sont desjson
fichiers.Example.java
ResourceLoader.java
la source
J'ai eu le même problème, j'ai fini par utiliser les ressources Guava beaucoup plus pratiques :
la source