打包后无法访问jar中的资源文件:filesystemnotfoundexception

vdgimpew  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(489)

嗨,我正在开发一个小的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:)请帮助我从resources文件夹访问模板文件,并注意html从同一文件夹获取图像。现在,模板和图像文件必须打包,并且应该能够作为单个jar运行。
更新:用7-zip解压jar文件以查看内容。我可以看到参考资料中的文件在jar中可用

谢谢!

6xfqseft

6xfqseft1#

您已经将所有内容打包到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文件中工作。

相关问题