Tout
J'ai créé un fichier jar contenant le fichier MANIFEST.MF suivant:
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é my.config qui est référencé dans mon fichier spring-context.xml comme ceci:
<bean id="..." class="...">
<property name="resource" value="classpath:my.config" />
</bean>
Si j’exécute le fichier jar, tout se présente 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
Des conseils?
Si vos fichiers spring-context.xml et my.config se trouvent dans des fichiers JAR différents, vous devrez utiliser classpath*:my.config
?
Plus d'infos ici
Assurez-vous également que vous utilisez resource.getInputStream()
pas resource.getFile()
lors du chargement depuis un fichier jar.
Je sais que cette question a déjà été répondu. Toutefois, pour ceux qui utilisent Spring Boot, ce lien m'a aidé - https://smarterco.de/Java-load-file-classpath-spring-boot/
Cependant, la resourceLoader.getResource("classpath:file.txt").getFile();
était à l'origine de ce problème et du commentaire de sbk:
C'est ça. Un fichier Java.io.File représente un fichier sur le système de fichiers, dans une structure de répertoires. Jar est un fichier Java.io.File. Mais tout ce qui est dans ce fichier est hors de portée de Java.io.File. En ce qui concerne Java, jusqu'à ce qu'il soit décompressé, une classe dans un fichier jar n'est pas différente de Word dans un document Word.
m'a aidé à comprendre pourquoi utiliser getInputStream () à la place. Ça marche pour moi maintenant!
Merci!
Dans le package jar du printemps, j'utilise la nouvelle exception ClassPathResource(filename).getFile(), which throws the
:
ne peut pas être résolu en chemin de fichier absolu car il ne réside pas dans le système de fichiers: jar
Mais utiliser new ClassPathResource(filename).getInputStream()
résoudra ce problème. La raison en est que le fichier de configuration dans le fichier jar n'existe pas dans l'arborescence de fichiers du système d'exploitation. Vous devez donc utiliser getInputStream()
.
J'avais un problème similaire lors de l'utilisation de Tomcat6.x et aucun des conseils que j'ai trouvés n'aidait. À la fin, j'ai supprimé le dossier work
(de Tomcat) et le problème a disparu.
Je sais que c'est illogique mais à des fins de documentation ...