簡體   English   中英

Classloader 和 FileInputStream 不會在 JAR 中找到文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM