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

作为jar运行时找不到类路径资源

袁卓
2023-03-14

在spring boot 1.1.5和1.1.6中都有这个问题--我正在使用@value注释加载一个类路径资源,当我从STS(3.6.0,Windows)中运行应用程序时,它可以正常工作。但是,当我运行一个mvn包,然后尝试运行jar时,我得到了FileNotFound异常。

资源message.txt位于src/main/resources中。我已经检查了jar,并验证它在顶层(与application.properties相同的级别)包含文件“message.txt”。

以下是应用程序:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements CommandLineRunner {

    private static final Logger logger = Logger.getLogger(Application.class);

    @Value("${message.file}")
    private Resource messageResource;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... arg0) throws Exception {
        // both of these work when running as Spring boot app from STS, but
        // fail after mvn package, and then running as java -jar
        testResource(new ClassPathResource("message.txt"));
        testResource(this.messageResource);
    }

    private void testResource(Resource resource) {
        try {
            resource.getFile();
            logger.debug("Found the resource " + resource.getFilename());
        } catch (IOException ex) {
            logger.error(ex.toString());
        }
    }
}

例外情况:

c:\Users\glyoder\Documents\workspace-sts-3.5.1.RELEASE\classpath-resource-proble
m\target>java -jar demo-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.1.5.RELEASE)

2014-09-16 08:46:34.635  INFO 5976 --- [           main] demo.Application
                  : Starting Application on 8W59XV1 with PID 5976 (C:\Users\glyo
der\Documents\workspace-sts-3.5.1.RELEASE\classpath-resource-problem\target\demo
-0.0.1-SNAPSHOT.jar started by glyoder in c:\Users\glyoder\Documents\workspace-s
ts-3.5.1.RELEASE\classpath-resource-problem\target)
2014-09-16 08:46:34.640 DEBUG 5976 --- [           main] demo.Application
                  : Running with Spring Boot v1.1.5.RELEASE, Spring v4.0.6.RELEA
SE
2014-09-16 08:46:34.681  INFO 5976 --- [           main] s.c.a.AnnotationConfigA
pplicationContext : Refreshing org.springframework.context.annotation.Annotation
ConfigApplicationContext@1c77b086: startup date [Tue Sep 16 08:46:34 EDT 2014];
root of context hierarchy
2014-09-16 08:46:35.196  INFO 5976 --- [           main] o.s.j.e.a.AnnotationMBe
anExporter        : Registering beans for JMX exposure on startup
2014-09-16 08:46:35.210 ERROR 5976 --- [           main] demo.Application
                  : java.io.FileNotFoundException: class path resource [message.
txt] cannot be resolved to absolute file path because it does not reside in the
file system: jar:file:/C:/Users/glyoder/Documents/workspace-sts-3.5.1.RELEASE/cl
asspath-resource-problem/target/demo-0.0.1-SNAPSHOT.jar!/message.txt
2014-09-16 08:46:35.211 ERROR 5976 --- [           main] demo.Application
                  : java.io.FileNotFoundException: class path resource [message.
txt] cannot be resolved to absolute file path because it does not reside in the
file system: jar:file:/C:/Users/glyoder/Documents/workspace-sts-3.5.1.RELEASE/cl
asspath-resource-problem/target/demo-0.0.1-SNAPSHOT.jar!/message.txt
2014-09-16 08:46:35.215  INFO 5976 --- [           main] demo.Application
                  : Started Application in 0.965 seconds (JVM running for 1.435)

2014-09-16 08:46:35.217  INFO 5976 --- [       Thread-2] s.c.a.AnnotationConfigA
pplicationContext : Closing org.springframework.context.annotation.AnnotationCon
figApplicationContext@1c77b086: startup date [Tue Sep 16 08:46:34 EDT 2014]; roo
t of context hierarchy
2014-09-16 08:46:35.218  INFO 5976 --- [       Thread-2] o.s.j.e.a.AnnotationMBe
anExporter        : Unregistering JMX-exposed beans on shutdown

共有2个答案

终翰学
2023-03-14

如果您使用的是spring框架,那么使用spring框架的FileCopyUtilsClasspathResource读入字符串就非常简单:

String data = "";
ClassPathResource cpr = new ClassPathResource("static/file.txt");
try {
    byte[] bdata = FileCopyUtils.copyToByteArray(cpr.getInputStream());
    data = new String(bdata, StandardCharsets.UTF_8);
} catch (IOException e) {
    LOG.warn("IOException", e);
}
夹谷琨
2023-03-14

resource.getFile()希望资源本身在文件系统中可用,即它不能嵌套在jar文件中。这就是为什么当您在STS中运行应用程序时,它可以工作,但一旦您构建了应用程序并从可执行JAR运行它,它就不工作了。与其使用getFile()访问资源的内容,我建议改用getInputStream()。这将允许您读取资源的内容,而不管它位于何处。

 类似资料:
  • 在此之前,我的应用程序总是编译和执行。我只是使用 运行时位于C:/Program Files/java和JAVA_HOME**上 这个应用程序来自TextPad,它使用类路径运行良好,执行良好。系统编译正常,但我的JAR文件无法执行 问题:它无法在运行时找到我的类路径(它在编译时工作得很好),给了我这个错误 类路径 .;C:\Program Files(x86)\java\jre7\lib\ext

  • 我遇到一个问题,IntelliJ13.1.4在运行单元测试时,在模块的目录中找不到文件。 在回答之前请注意,我已经完成了以下所有操作: 该模块是一个分级项目,如果我运行,单元测试运行良好。 我过去在IntelliJ中成功地运行了这个单元测试,它找到了模块。(也许是Intellij的早期版本?) 我已经检查了IntelliJ模块设置,并且目录被标记为测试资源目录。(见下面的截图。) 我正在类中转储单

  • 我使用NetBeans的教程在java中创建了一个程序,它在Windows中运行得很好。但是,当我尝试运行相同的在Linux(RedHat)中,我遇到以下异常: 线程“main”java中出现异常。lang.UnsupportedClassVersionError:JVMCFRE003主版本错误;类=我的/数字编辑/数字编辑UI,偏移量=6 通过运行此命令: java-jar NumberAddi

  • 问题内容: 好的,我知道这个问题以前已经被问过很多次了,但是我已经搜索了一下,查看了示例,并查看了过去一个月中关于SO的问题,我真的无法解决这个问题。我认为问题是我希望能够从Eclipse和命令行运行该程序。我也在使用OSX,我认为我正在阅读的许多示例都是针对Windows / Linux的。 如果我有一个要在命令行中运行的,在Eclipse中编译的简单程序,请执行以下操作: 我有另一个程序在Ec

  • 我从GitHub下载了这段代码,看看是否可以对其进行定制,使其适用于我正在进行的项目。我希望这是我的最后一期,但我完全被这个错误所困住了。我可以构建和运行应用程序,但它在启动时崩溃。 我在这里经历了许多类似的问题,我根据解决方案做出了修改,但它们似乎对我不起作用。我是这方面的新手,如果有任何帮助,我将不胜感激。拜托...任何人。:) 这是我的错误输出-

  • 问题内容: 我有一个命令行应用程序,可以下载一些报告,进行处理,然后将数据上传到Google云端硬盘。我正在为所有需要的魔术字符串使用Typesafe- Config 。Typesafe- Config在我的application.conf文件的类路径上查找并使用HOCON将配置对象映射到我的类中的字段,如下所示: 来自: 来自: 我正在使用来构建可执行文件.jar以便在远程服务器上轻松部署。该插