簡體   English   中英

打包后無法訪問jar中的資源文件:FileSystemNotFoundException

[英]Unable to access the resources file in jar after packaging : FileSystemNotFoundException

嗨,我正在開發一個小型 Java 應用程序(對這個有點新),它接受一個輸入文件並給出一個網頁。 這里的 HTML 模板和網頁的圖像文件位於資源文件夾中。

在此處輸入圖片說明

下面是我在代碼中訪問 html 模板文件的方式。(我需要將 HTML 模板作為字符串讀取)

{       
        String htmlString;
    
        ClassLoader classLoader = getClass().getClassLoader();
        URL fileurl = classLoader.getResource("template.html");
        htmlString = String.join("\n", Files.readAllLines(Paths.get(fileurl.toURI()))); 

    }

當從 Eclipse 運行時,代碼工作正常,但當我將它作為 jar 運行時失敗。(java.nio.file.NoSuchFileException:) 請幫助我從資源文件夾訪問模板文件,並注意 html 從同一個文件夾。 現在模板和圖像文件必須打包並且應該能夠作為單個 JAR 運行。

更新:使用 7-zip 解壓縮 jar 文件以查看內容。 我可以看到資源中的文件可用於 jar 在此處輸入圖片說明

謝謝!

您已將所有內容打包到 jar 中,因此資源的路徑名不再是文件的有效路徑。 如果您添加了此日志記錄,您會看到 jar 條目的路徑類似於jar:file:/C:/path/to/your.jar!/template.html ,它不能被Files.readAllLines打開:

URI uri = fileurl.toURI();
System.out.println("uri="+uri);

解決方案很簡單,只需將資源定位為InputStream ,它必須在類路徑上:

String htmlString;
ClassLoader classLoader = getClass().getClassLoader();
try(InputStream in = classLoader.getResourceAsStream("template.html")) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    in.transferTo(out);
    htmlString = new String(out.toByteArray()); // as platform encoding
}

如果在分解目錄中運行代碼時res目錄是類路徑的一部分,則此方法有效,如果“res”的內容在 jar 中,則此方法適用於 JAR 文件。

暫無
暫無

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

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