【发布时间】:2016-10-13 09:32:19
【问题描述】:
我正在使用 maven 构建我的 jar 文件,它们包含所有依赖项,所以我可以通过运行 jar
java -jar
在 jar 中,我有一个 config.json,它是应用程序配置。 我验证了 config.json 确实在 jar 中:
/> jar tf cloudimport-0.1-jar-with-dependencies.jar | grep config.json
config.json
但是当我运行应用程序时,它找不到 config.json:
ClassLoader classLoader = getClass().getClassLoader();
System.out.println(classLoader.getResource("config.json"));
File configFile = new File(classLoader.getResource(fileName).getFile());
(Exception thrown here ->) FileReader fileReader = new FileReader(configFile);
BufferedReader br = new BufferedReader(fileReader);
产生:
java -jar cloudimport-0.1-jar-with-dependencies.jar
jar:file:/home/ubuntu/cloudimport-0.1-jar-with-dependencies.jar!/config.json
java.io.FileNotFoundException: file:/home/ubuntu/cloudimport-0.1-jar-with-dependencies.jar!/config.json (No such file or directory)
运行上述代码的类位于jar中:
com.test.cloudsync.config.AppConfig.class
如果我在 windows 中从 intelliJ 运行应用程序,它可以正常工作,但从 intelliJ 执行意味着执行的是主类而不是 jar。
我已经搜索过这个,但答案如下: What is the difference between Class.getResource() and ClassLoader.getResource()?
没有帮助...
// 编辑 建议是 ClassLoader 没有抛出 Excpetion - 这是真的。我删除了一些东西,所以我可以限制范围,现在看来问题是我尝试打开 FileINputStream 但这不可能我猜文件是否带有 jar?
完整的堆栈跟踪:
/> java -jar java_cloudsync/com/tsg/cloudimport/cloudimport/0.1/cloudimport-0.1-jar-with-dependencies.jar
jar:file:/home/ubuntu/java_cloudsync/com/tsg/cloudimport/cloudimport/0.1/cloudimport-0.1-jar-with-dependencies.jar!/config.json
java.io.FileNotFoundException: file:/home/ubuntu/java_cloudsync/com/tsg/cloudimport/cloudimport/0.1/cloudimport-0.1-jar-with-dependencies.jar!/config.json (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileReader.<init>(FileReader.java:72)
at com.tsg.cloudsync.config.AppConfig.readConfigFile(AppConfig.java:33)
at com.tsg.cloudsync.config.AppConfig.<init>(AppConfig.java:23)
at com.tsg.cloudsync.awsutils.SQSSocket.<init>(SQSSocket.java:34)
at com.tsg.cloudsync.awsutils.SQSSocket.<clinit>(SQSSocket.java:19)
at com.tsg.cloudsync.NewFileWatchDog.main(NewFileWatchDog.java:24)
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.tsg.cloudsync.NewFileWatchDog.main(NewFileWatchDog.java:24)
Caused by: java.lang.NullPointerException
at com.tsg.cloudsync.config.AppConfig.getAWSCredentials(AppConfig.java:50)
at com.tsg.cloudsync.awsutils.SQSSocket.<init>(SQSSocket.java:35)
at com.tsg.cloudsync.awsutils.SQSSocket.<clinit>(SQSSocket.java:19)
... 1 more
【问题讨论】:
-
尝试使用
getResource("/config.json")-> 请注意资源名称前的/ -
您能否发布以
java.io.FileNotFoundException失败的代码。根据System.out.println(classLoader.getResource("config.json"))打印的jar:file:/home/ubuntu/cloudimport-0.1-jar-with-dependencies.jar!/config.json行,您已经证明可以找到该文件。 -
我删除了一些东西,可能会限制异常,有关详细信息,请参阅我的编辑。似乎无法读取输入流,因为文件在我猜的 jar 内?