里面的文件是不可见的spring

所有

我用下面的MANIFEST.MF创build了一个jar文件:

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 

在它的根目录下有一个名为my.config的文件,在我的spring-context.xml中被引用,如下所示:

 <bean id="..." class="..."> <property name="resource" value="classpath:my.config" /> </bean> 

如果我运行的jar,一切看起来很好,除了加载该特定的文件:

 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 
  • 类从jar中加载
  • spring和其他依赖从被分离的瓶子加载
  • 加载spring上下文(新的ClassPathXmlApplicationContext(“spring-context / applicationContext.xml”))
  • my.properties被加载到PropertyPlaceholderConfigurer(“classpath:my.properties”)
  • 如果我把我的.config文件放在文件系统之外,并将资源url更改为“file:”,一切似乎都没有问题。

有小费吗?

如果你的spring-context.xml和my.config文件在不同的jar中,那么你将需要使用classpath*:my.config

更多信息在这里

此外,请确保在从jar文件中加载时使用resource.getInputStream()而不是resource.getFile()

我知道这个问题已经被回答了。 但是,对于那些使用弹簧引导,这个链接帮助我 – https://smarterco.de/java-load-file-classpath-spring-boot/

但是, resourceLoader.getResource("classpath:file.txt").getFile(); 是造成这个问题和sbk的评论:

而已。 java.io.File表示文件系统上的目录结构中的文件。 Jar是一个java.io.File。 但是该文件中的任何内容都超出了java.io.File的范围。 就Java而言,直到它被解压缩之前,jar文件中的类与word文档中的一个词没有区别。

帮我理解了为什么要使用getInputStream()来代替。 现在适合我!

谢谢!

当使用Tomcat6.x时,我遇到了类似的问题,而且我发现的build议没有任何帮助。 最后,我删除了(Tomcat的) work文件夹,问题没有了。

我知道这是不合逻辑的,但为了文件的目的…