在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
如果您使用的是spring框架,那么使用spring框架的FileCopyUtils
将ClasspathResource
读入字符串
就非常简单:
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);
}
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以便在远程服务器上轻松部署。该插