web-dev-qa-db-fra.com

Le fichier à l'intérieur du pot n'est pas visible pour le printemps

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
  • les classes sont chargées depuis l'intérieur du pot
  • le printemps et d'autres dépendances sont chargés à partir de pots séparés
  • le contexte spring est chargé (new ClassPathXmlApplicationContext ("spring-context/applicationContext.xml"))
  • my.properties est chargé dans PropertyPlaceholderConfigurer ("classpath: my.properties")
  • si je mets mon fichier .config hors du système de fichiers et que je modifie l'URL de la ressource en "fichier:", tout semble aller pour le mieux ...

Des conseils?

73
BTakacs

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.

148
sbk

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!

34
Jobin Thomas

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().

17
tao zeng

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 ...

2
takacsot