JasperReports从jar构建报告

时间:2016-07-13 11:47:37

标签: java maven servlets jar

项目结构:

战争包含:

  • 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工作正常,但如果我通过war和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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

ConfigException Xor Conn

答案 2 :(得分:0)

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

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

  2. 不应将它们放入jar中,而应将它们添加到战争中。

  3. 构建jar并将其作为依赖战争

  4. 与jar的依赖关系构建战争

  5. 完成