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

在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中运行应用程序时它可以工作,但是一旦您构建了应用程序并从可执行jar中运行它后,它就无法工作。建议不要使用getFile()访问资源的内容,getInputStream()而应使用。这样一来,无论资源位于何处,您都可以阅读其内容。

以上是 作为jar运行时找不到类路径资源 的全部内容, 来源链接: utcz.com/qa/409579.html

回到顶部