Classpath Resource Not Found When Running as a JAR
This issue can be encountered when loading a classpath resource using the @Value annotation in Spring Boot applications. While it functions correctly when run from IDEs like STS, running the jar file generated via mvn package results in FileNotFoundException.
Addressing the Issue
The underlying reason is that resource.getFile() expects the resource to be directly available on the file system. However, when running as a JAR, resources are packaged within the archive, rendering that approach ineffective.
Solution
To resolve this issue, replace getFile() with getInputStream(). This method allows you to access the resource's contents regardless of its location. Here's the modified code:
<code class="java">@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 { InputStream inputStream = resource.getInputStream(); logger.debug("Found the resource " + resource.getFilename()); } catch (IOException ex) { logger.error(ex.toString()); } } }</code>
The above is the detailed content of Why Does My Spring Boot Application Fail to Find Classpath Resources When Run as a JAR?. For more information, please follow other related articles on the PHP Chinese website!