当前位置: 首页 > 知识库问答 >
问题:

对于spring,jar中的文件不可见

富勇军
2023-03-14

全部

我创建了一个jar文件,其中包含以下manifest.mf:

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上下文.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
  • 类从罐子内部加载
  • spring和其他依赖项从分离的JAR加载
  • 加载spring上下文(新的ClassPathXmlApplicationContext(“spring-context/ApplicationContext.xml”))
  • my.properties加载到PropertyPlaceHolderConfigureer(“classpath:my.properties”)
  • 如果我将.config文件放在文件系统之外,并将资源url更改为“file:”,似乎一切都很好...

有什么提示吗?

共有2个答案

祁辰阳
2023-03-14

我知道这个问题已经有了答案。但是,对于那些使用spring boot的人来说,这个链接帮助了我-https://smarterco.de/java-load-file-classpath--boot/

但是,ResourceLoader.getResource(“classpath:file.txt”).getFile();导致了此问题,而SBK的注释是:

就是这样。java.io.file表示文件系统中目录结构中的文件。Jar是一个java.io.file。但该文件中的任何内容都超出了java.io.file的范围。就Java而言,在未被压缩之前,jar文件中的一个类与word文档中的一个单词没有什么区别。

帮助我理解了为什么要改用getInputStream()。现在对我管用了!

谢谢!

魏宏邈
2023-03-14

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

此处提供更多信息

此外,确保从jar文件内部加载时使用的是resource.getInputStream()而不是resource.getFile()

 类似资料:
  • spring boot可运行的jar文件是针对生产环境的,是针对生产所需的任何优化,还是针对测试/原型设计,我们应该在生产机器的应用服务器上生成和部署WAR文件?

  • 我正在尝试将我的checkers程序从Eclipse导出到一个可运行的jar文件中。我得到一个jar文件,但它不运行。。。它给了我关于未找到的类的神秘错误消息。jar文件的意义不在于它包含了它所需要的所有类吗?我不知道现在该做什么。 这是我运行罐子时得到的: 知道是的一个内部类可能会有所帮助?有什么问题吗?我在导出向导中尝试了“提取所需库”和“打包所需库”。 我还尝试从命令行使用,但效果不太好。以

  • 在我的Spring Boot配置文件中,我是否可以指定相对于Spring Boot jar的日志文件位置,而不是相对于启动jar的目录? null 开始: 结果: /random/dir/logs/app.log 期望: /app/dir/logs/app.log 附加信息:jar将运行在不同的操作系统上。因此jar路径可能类似于: null 完整解决方案:基于@Satyesht 开始:

  • 问题内容: 问题说明了一切。 在我的情况下,特殊之处在于当前工作目录不是jar文件的位置,而是(我的jar文件由Windows使用右键菜单启动,我想将文件夹的路径作为参数传递给jar) 。 现在,我想加载一个与jar相同的文件夹中的配置文件。该文件的目的当然是为jar提供设置。对我来说重要的是,xml文件 位于 jar文件 之外 ,以便于编辑。 我很难加载该文件。Windows执行该行 调用整个过

  • 我有一些基于的测试用例,并尝试生成文件。我使用在下设置工件的详细信息。我选择了classname,但得到错误,这是不可接受的。 更新2018.05.03.我在一个新类中创建了main方法,但得到了相同的错误消息。

  • 我通过spring-boot-maven-plugin(V1.3.6)创建完全可执行的jar,方法如下: 当我从目标目录启动类似于可执行文件的结果jar(类似于“./app.jar”,而不是通过“java-jar app.jar”)时,应用程序可以正确地启动和工作,但是如果我将此jar复制到另一个目录,我会得到错误:“无效或损坏的jar文件/home/user/spring”。(我使用Linux