簡體   English   中英

如何使用 intellij 2020 或終端或 maven 插件的資源文件構建 jar

[英]how to build a jar with the resource file by intellij 2020 or terminal or maven plugins

這是我正在讀取資源文件的簡單應用程序,它工作正常:-

public class App {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader =
            new BufferedReader(
                new FileReader(
                    Objects.requireNonNull(
                        Objects.requireNonNull(
                            App.class.getClassLoader().getResource("file.txt")
                        ).getFile()
                    )
                )
            );
        String line = "";
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
    }
}

我想用資源文件制作一個可執行的 jar 文件。 我遵循這個 不幸的是,當我運行 jar 時它找不到。 錯誤:- ReadFileExample.jar./file.txt(沒有這樣的文件或目錄),實際上,我不需要使用 IDE 更容易從終端或 Z402C5D9AF6B437174DZ402C5D9AF6B437174DZ402C 插件請讓我知道如何通過 IDE 或終端或任何 maven 插件將我的資源文件添加到 jar 中?

new FileReader(

這一點意味着它永遠不會起作用。 FileReader 讀取文件。 而且只有文件。 由此得名。 您在開發期間“幸運”地工作,因為此時資源是一個實際文件。

不過也有好消息。 您的代碼非常復雜,可以變得更簡單:

  1. .getClassLoader().getResource(...).getResource更多的代碼和更糟糕的代碼。 getCL 在特殊情況下可以返回 null。 一定要調整參數; 它現在與您的 class 所在的位置相關,您可以通過在前面添加一個斜杠來返回“從根目錄”。
  2. 顯然,不要使用 FileReader。 實際上,永遠不要使用那個 class。
  3. 您的代碼未能指定編碼。 這是不好的; 因此,編碼將默認為您運行它的系統作為默認編碼,因此根據定義,不能保證與您在 jar 文件中的內容相匹配。 始終明確。
  4. 這些是 25 年的 API,java 現在有更好的 API。 讓我們使用它們來嘗試使這段代碼更易於閱讀。
  5. requireNonNull 調用在這里沒有用; 如果您嘗試將 null 引用傳遞給例如 FileReader 的構造函數,則您已經獲得了 NPE。
  6. 您的代碼打開了一個資源並且沒有安全地關閉它。 這會導致您泄漏句柄,這意味着您的應用程序很快就會“死” - 它仍有一堆對象仍在 memory 中,它們持有打開的操作系統級文件句柄,並且操作系統根本不會為您的進程提供任何進一步的句柄. 任何與操作系統交互的嘗試(建立網絡連接、打開文件等)都將不再起作用,直到您關閉 VM 並重新啟動它。 這就是存在 try-with-resources 的原因,以防止這種情況。 這個問題很難用瑣碎的應用程序和測試來解決。

把它們放在一起:

try (var raw = App.class.getResourceAsStream("/file.txt");
  var in = new BufferedReader(new InputStreamReader(raw, StandardCharsets.UTF_8))) {
    String line = "";
    while ((line = in.readLine()) != null) {
        // process line here.
    }
}

暫無
暫無

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

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