在 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
resource.getFile()期望资源本身在文件系统上可用,即它不能嵌套在 jar 文件中。这就是为什么当您在 STS(Spring Tool Suite)中运行您的应用程序时它可以工作,但一旦您构建了应用程序并从可执行 jar 运行它就不能工作。getFile()我建议使用而不是使用来访问资源的内容getInputStream()。这将允许您阅读资源的内容,无论它位于何处。
resource.getFile()
getFile()
getInputStream()