BTa*_*acs 82 spring jar classpath
所有
我在里面创建了一个包含以下MANIFEST.MF的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
Run Code Online (Sandbox Code Playgroud)
在它的根目录中有一个名为my.config的文件,它在我的spring-context.xml中引用,如下所示:
<bean id="..." class="...">
<property name="resource" value="classpath:my.config" />
</bean>
Run Code Online (Sandbox Code Playgroud)
如果我运行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
Run Code Online (Sandbox Code Playgroud)
有小费吗?
sbk*_*sbk 164
如果你的spring-context.xml和my.config文件在不同的jar中,那么你需要使用classpath*:my.config
?
更多信息在这里
另外,确保在从jar文件中加载时resource.getInputStream()
不使用resource.getFile()
.
jma*_*ewt 36
我知道这个问题已经得到解答了.但是,对于那些使用spring boot的人来说,这个链接帮助了我 - 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().它现在对我有用!
谢谢!
小智 22
在spring jar包中,我使用了新的ClassPathResource(filename).getFile(), which throws the
异常:
无法解析为绝对文件路径,因为它不驻留在文件系统中:jar
但使用new ClassPathResource(filename).getInputStream()
会解决这个问题.原因是jar中的配置文件不存在于操作系统的文件树中,因此必须使用getInputStream()
.
错误消息是正确的(如果不是很有帮助):我们尝试加载的文件不是文件系统上的文件,而是 ZIP 中 ZIP 中的一大块字节。
通过实验(Java 11,Spring Boot 2.3.x),我发现它无需更改任何配置甚至通配符即可工作:
var resource = ResourceUtils.getURL("classpath:some/resource/in/a/dependency");
new BufferedReader(
new InputStreamReader(resource.openStream())
).lines().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
70983 次 |
最近记录: |