【问题标题】:JasperReports build report from jarJasperReports 从 jar 构建报告
【发布时间】:2016-07-13 11:47:37
【问题描述】:

项目结构:

战争包含:

  • Servlet.class
  • pom.xml(包含jar作为依赖)

罐子:

  • 包含用于战争的类

Servlet 创建一个实例并调用方法generate():

 @Override
public void doGet(HttpServletRequest req,
                  HttpServletResponse resp)
        throws ServletException, IOException {
A a = new a();
a.generate();
}

那么,A.class 中的方法generate 包含以下几行:

        InputStream is = this.getClass().getResourceAsStream("/reports/foo.jrxml");
    InputStream isSubReport = this.getClass().getResourceAsStream("/reports/foo_subreport.jrxml");
        JasperDesign jasperDesign = JRXmlLoader.load(isSubReport);

所以,当我从 jar 项目运行此方法时 - 一切正常。

但是,当我从 war 中调用这个方法时,它有这个 jar 作为依赖项 - 我在线上遇到了一个异常

JasperDesign jasperDesign = JRXmlLoader.load(isSubReport);

从 jar 中调用方法以读取其资源并使其工作的正确方法是什么?

更新:

还是没有解决办法

如果我将 servlet 与报告放在同一个战争中 - InputStream 工作正常,但如果我通过战争和 jar 拆分它们 - 不起作用。

冻结

在线JasperDesign jasperDesign = JRXmlLoader.load(isSubReport);

而且我有一个异常,令人惊讶的是,如果没有深度调试甚至看不到(没有调试没有异常,白屏):

Method threw 'net.sf.jasperreports.engine.JRRuntimeException' exception. Cannot evaluate net.sf.jasperreports.engine.JRRuntimeException.toString()

这个异常出现在这里(这是来自 jasper-reports lib 的类):

 public JasperDesign loadXML(InputSource is) throws JRException {
    try {
        this.digester.push(this);
        this.digester.parse(is);
    } catch (SAXException var7) {
        throw new JRException(var7);
    } catch (IOException var8) {
        throw new JRException(var8);
    } finally {
        this.digester.clear(); // this method works fine
    }
    //this line can not be reached (somewhere appears exception)
    if(this.errors.size() > 0) { ...

并且要明确一些东西 - 异常的“messageKey”和“detailMessage”:

util.message.provider.not.found

【问题讨论】:

    标签: java maven servlets jar


    【解决方案1】:

    将 jar 文件添加到您的 web-inf/lib 文件夹并导入 JasperDesign 包。

    【讨论】:

    • 将在几分钟内尝试
    • 等等,我已经导入了。问题出在 inputStream 中
    • 你遇到了什么异常?
    • 方法抛出了“net.sf.jasperreports.engine.JRRuntimeException”异常。无法评估 net.sf.jasperreports.engine.JRRuntimeException.toString()
    【解决方案2】:

    如果输入流有问题,那么试试这个

    InputStream inputstream = new FileInputStream("/reports/foo.jrxml");
    

    【讨论】:

      【解决方案3】:

      我通过搜索类似问题找到了答案。

      1. 您应该构建没有任何依赖关系的 jar。

      2. 您应该将它们添加到战争中,而不是将它们放入罐子中。

      3. 构建jar并将其作为war的依赖项

      4. 使用 jar 的依赖项构建战争

      5. 完成

      【讨论】:

        猜你喜欢
        • 2013-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        相关资源
        最近更新 更多