java.io.FileNotFoundException 使用 tomcat 时

java.io.FileNotFoundException when using tomcat

我有一个应用程序 运行 在本地主机上运行良好,但是当它部署在 tomcat

上时我遇到了问题

我用来读取文件的代码是:

File jasperFile = new File(getClass().getClassLoader().getResource("reports/Header.jasper").getFile());

我在 catalina 中收到此错误:

net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: file:/usr/local/apache-tomcat9/webapps/com.peek.facture.server/WEB-INF/lib/facture.server-1.0.0-SNAPSHOT.jar!/reports/Header.jasper

触发我的是“!” jar 名称的末尾,它来自哪里?

我也尝试下载 jar,解压,我的 Header.jasper 正确地位于 resources/reports/ 文件夹中

当您 运行 在您的本地 独立物理 文件 Header.jasper 存在时(当您浏览 reports 目录)。

然而,当您部署到 tomcat 服务器时,该 独立物理 文件不再存在。相反,如果您正确设置构建,当您打开 jar (facture.server-1.0.0-SNAPSHOT.jar) 时,应该有一个名为 reports 的目录,其中包含文件 Header.jasper

因此,当您尝试通过 getClass().getClassLoader().getResource(...).getFile() 获取资源时,您实际上是在尝试访问 独立物理 文件。相反,您需要将资源作为 InputStream 获取,然后使用 if 从那里...

InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("reports/Header.jasper");

使用资源时,最好以这种方式访问​​它们。特别是如果您计划使用单个工件部署到任何地方,因为您的资源应该与您的工件打包在一起。