簡體   English   中英

如何將資源文件打包到可運行的jar中

[英]How can I package a resource file into a runnable jar

我已經在很多方面嘗試了這個,並遵循了幾個在線指令,比如這個 - Eclipse導出的Runnable JAR沒有顯示圖像但到目前為止,沒有成功。

我有一個非常簡單的程序,它讀取文本文件(test.txt)並將其內容打印到標准輸出。 我正在使用Eclipse。 這是我所做的 -

  • 我把文本文件放到一個名為'resources'的文件夾中
  • 我右鍵單擊資源文件夾,選擇“構建路徑”並點擊“用作資源文件夾”
  • 在我的代碼中,我嘗試了兩種方法來處理文件 - (a)作為“/test.txt”和(b)作為“resources / test.txt。后一種方法在Eclipse中運行程序時有效。但是,當我將項目導出為可運行的jar文件時,該方法有效。資源文件夾無法包含在jar文件中。

任何幫助都感激不盡。

附錄:這是代碼。

public class FileIOTest {

public static void main(String[] args) {
    String line;
    try {
        BufferedReader br = new BufferedReader(new FileReader(new File("/test.txt")));
        while((line = br.readLine()) != null){
            System.out.println(line);
        }

    br.close(); 
    }
    catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}

}

}

您無法通過FileReader訪問Jar文件中的資源,因為它不是文件系統上的文件。 Java確實有一種機制來訪問類路徑中的資源(包括在Jars中): ClassLoader.getResourceAsStream() 您可以將它與默認的類加載器一起使用:

BufferedReader br = new BufferedReader(new InputStreamReader(
                        ClassLoader.getSystemClassLoader()
                                   .getResourceAsStream("resource/test.txt")));

請注意, getResourceAsStream返回null而不是拋出異常,因此您可能希望首先獲取流,檢查是否為null ,然后拋出異常或處理它。

您將希望在jar中提供完整路徑作為路徑。

文件與資源的工作方式不同 如果您需要資源,那么您不應該嘗試使用任何File(Xxx)變體,它們將在文件系統上查找。

您提供的鏈接使用Class.getResource返回一個URL,但也有Class.getResourceAsStream返回一個InputStream ,您可以將其包裝在InputStreamReader 例如

InputStream is = FileIOTest.class.getResourceAsStream("/text.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

你可以創建沒有eclipse的jar。 例如,如果我在包src有一個Demo類(目錄是相同的),並且資源文件(名為testing.txt )在resources目錄中。 我在目錄的根目錄下添加了一個Manifest.txt文件:

Manifest-Version: 1.0
Main-Class: src.Demo

Demo類看起來像:

package src;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Demo {

    public static void main(String... args) {

        try (BufferedReader br = new BufferedReader(new InputStreamReader(Demo.class.getResourceAsStream("/resources/testing.txt"))))
        {

            String sCurrentLine;

            while ((sCurrentLine = br.readLine()) != null) {
                System.out.println(sCurrentLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

testing.txt文件如下:

hello world
How are you?

編譯Demo.java以獲取Demo.class

javac src/Demo.java 

創建jar

jar cfm myJar.jar Manifest.txt src/* resources/*

並運行它

java -jar myJar.jar 

在eclipse中,只需在類路徑中添加resources文件夾(確保它在jar中),並將其作為類路徑資源( getResourceAsStream方法)讀取

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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