Fichier à l'intérieur de pot n'est pas visible pour le printemps
Tous
J'ai créé un fichier jar avec le MANIFESTE suivantes.MF 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
Dans sa racine, il y a un fichier appelé mon.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 je lance le pot, tout semble parfait escept 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
- classes sont chargées de la provenance de l'intérieur du bocal
- de printemps et d'autres dépendances sont chargés à partir de bocaux séparés
- printemps contexte est chargé (nouveau ClassPathXmlApplicationContext("spring-context/applicationContext.xml"))
- mon.propriétés est chargé dans PropertyPlaceholderConfigurer ("classpath:mon.les propriétés")
- si j'ai mis mon .fichier de configuration à l'extérieur du système de fichiers, et de changer l'url de ressource pour 'fichier:', tout semble aller pour le mieux...
Des conseils?
Vous devez vous connecter pour publier un commentaire.
Si votre spring-context.xml et mon.les fichiers de configuration se trouvent dans différents pots, alors vous aurez besoin d'utiliser
classpath*:my.config
?Plus d'infos ici
Aussi, assurez-vous d'utiliser
resource.getInputStream()
pasresource.getFile()
lors du chargement à partir de l'intérieur d'un fichier jar.resource.getInputStream()
, qu'est-ce queresource
ici?java.io.InputStream
du fichier (viajava.io.File
n'est pas possible lorsque le fichier est dans un BOCAL). Une fois que vous acceptez cela, alors il est logique pourquoi cette Réponse sur une question similaire (à l'aide deInputStream
) a la code pour le faire.Je sais que cette question a déjà été répondu. Cependant, pour ceux qui utilisent le printemps de démarrage, ce lien m'a aidé à - https://smarterco.de/java-load-file-classpath-spring-boot/
Cependant, la
resourceLoader.getResource("classpath:file.txt").getFile();
a été à l'origine de ce problème et sbk commentaire:m'a aidé à comprendre pourquoi pour utilisation getInputStream() à la place. Il fonctionne pour moi maintenant!
Merci!
Au printemps jar paquet, j'ai utiliser de nouvelles
ClassPathResource(filename).getFile(), which throws the
exception:Mais en utilisant de nouveaux
ClassPathResource(filename).getInputStream()
permettra de résoudre ce problème. La raison en est que le fichier de configuration dans le bocal n'existe pas dans le système d'exploitation de l'arborescence des fichiers,il faut utilisergetInputStream()
.J'ai eu le même problème lors de l'utilisation de Tomcat6.x et aucun des conseils que j'ai trouvé a été d'aider.
À la fin j'ai supprimé
work
dossier (Tomcat) et le problème à disparu.Je sais que c'est illogique, mais pour le but de la documentation...
La réponse par @sbk est la façon dont nous devrions le faire au printemps de l'environnement de démarrage (en dehors de @Valeur("${classpath*:})), à mon avis. Mais dans mon scénario, il n'a pas de travail si l'exécuter à partir d'autonome jar..peut-être j'ai fait quelque chose de mal.
Mais cela peut être une autre façon de faire cela,
J'ai eu un problème de manière récursive du chargement des ressources dans mon Printemps application, et a constaté que le problème était que je devrais être à l'aide de
resource.getInputStream
. Voici un exemple montrant comment lire de manière récursive tous les fichiers dansconfig/myfiles
qui sontjson
fichiers.Example.java
ResourceLoader.java