【问题标题】:java.io.FileNotFoundException when using tomcat使用 tomcat 时出现 java.io.FileNotFoundException
【发布时间】:2019-12-20 15:06:19
【问题描述】:

我的应用程序在 localhost 上运行良好,但在部署到 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/文件夹中是正确的

【问题讨论】:

  • 试试 /reports/Header.jasper
  • 使用 /reports 在 localhost 中获取 java.lang.NullPointerException
  • 你是如何在“localhost”上运行它的?您是刚从 IDE 启动它,还是构建 + 部署 jar 或 war 到本地 tomcat?
  • 当它从我的 IDE 启动时,它可以工作,但在 tomcat 上运行时出现此错误
  • 停止使用文件 IO 获取嵌入在您的 jar 中且可从类路径获得的资源。文件 IO 用于文件。不适用于嵌入式资源。你不需要文件。只需将 URL 传递给 Jasper。如果它不接受 URL,请使用 getResourceAsStream() 并传递返回的流。

标签: java tomcat filenotfoundexception


【解决方案1】:

当您在本地运行时,存在一个独立物理文件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");

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多