![](/img/trans.png)
[英]ClassLoader.getResourceAsStream can't find resource in JAR file
[英]Classloader and FileInputStream won't find file inside JAR
我正在用 maven 構建我的 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 執行意味着執行的是 Main Class 而不是 jar。
我已經搜索過這個,但答案如下: Class.getResource() 和 ClassLoader.getResource() 之間有什么區別?
沒有幫助...
// EDIT 建議是 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
所以結果是我試圖定義一個
ClassLoader classLoader = getClass().getClassLoader();
File f = new File(classLoader.getResource(fileName).getFile())
FileReader fileReader = new FileReader(configFile);
BufferedReader br = new BufferedReader(fileReader);
這是不可能的,因為 jar 本身是一個文件。 因此,要獲取文件的內容,請執行以下操作:
ClassLoader classLoader = getClass().getClassLoader();
InputStream in = classLoader.getResourceAsStream(fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
另請參閱此處: 從 jar 中讀取資源文件
注意getResourceAsStream(fileName)
和getResource(fileName).getFile()
感謝您為我指明正確的方向!
假設以下簡單結構
bin/
src/AppConfig.java
src/config.json
src/manifest.mf
應用程序配置文件
package com.test.cloudsync;
public class AppConfig {
void check() {
ClassLoader classLoader = getClass().getClassLoader();
System.out.println(classLoader.getResource("config.json"));
}
public static void main(String[] args) {
new AppConfig().check();
}
}
清單文件
Main-Class: com.test.cloudsync.AppConfig
編譯和構建 Jar 文件
javac -d bin/ src/*.java
cp src/config.json bin/config.json
jar cfm test.jar src/manifest.mf -C bin/ .
運行罐子
java -jar test.jar
輸出
jar:file:/tmp/foobar/test.jar!/config.json
這表明異常不是由行ClassLoader classLoader = getClass().getClassLoader()
引發的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.