【问题标题】:JasperReports: calling report from jarJasperReports:从 jar 调用报告
【发布时间】:2013-12-13 14:47:54
【问题描述】:

我正在为 NetBeans 7.2 使用 JasperReports 4.7.1 插件 从 mysql 数据库生成报告 当我从 ide 运行应用程序时,没有发现问题,请接受此警告:

log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
log4j:WARN Please initialize the log4j system properly.

但报告生成并正确查看。

问题是,当我清理并构建应用程序然后从 jar 文件中运行它时,报告没有生成并且没有给我任何异常,只是没有查看报告,其他一切都正常吗?

这是我在JasperViewer中查看报告的功能:

public void printInvoice(int invid) throws IOException {
    try {
        String sql = "SELECT\n" +
                "     ordersdetails.`ITEMNAME` AS ordersdetails_ITEMNAME,\n" +
                "     ordersdetails.`AMOUNT` AS ordersdetails_AMOUNT,\n" +
                "     ordersdetails.`PRICE` AS ordersdetails_PRICE,\n" +
                "     invoices.`INVOICEID` AS invoices_INVOICEID,\n" +
                "     invoices.`CUSTOMER` AS invoices_CUSTOMER,\n" +
                "     invoices.`THEDATE` AS invoices_THEDATE,\n" +
                "     invoices.`COST` AS invoices_COST\n" +
                "FROM\n" +
                "     `invoices` invoices RIGHT OUTER JOIN `ordersdetails` ordersdetails ON invoices.`INVOICEID` = ordersdetails.`INVOICE` where invoices.invoiceid=" + invid;

        InputStream in = this.getClass().getResourceAsStream("/reports/invoice.jrxml");

        JasperDesign jd = JRXmlLoader.load(in);

        JRDesignQuery q = new JRDesignQuery();
        q.setText(sql);
        jd.setQuery(q);

        JasperReport jasp_rep = JasperCompileManager.compileReport(jd);

        JasperPrint jasp_print = JasperFillManager.fillReport(jasp_rep, null, mc.getConnection());
        JasperViewer.viewReport(jasp_print, false);
    } catch (JRException e) {
        JOptionPane.showMessageDialog(null, e.getMessage());
        System.out.println(e);
    }
}

【问题讨论】:

  • 你应该关注这个问题:stackoverflow.com/questions/8943661/…
  • 警告不是问题问题是从这个方法到结束 JRXmlLoader.load() 使用编译后的jar时没有任何工作
  • 是的,警告只是警告......但在生产中,这意味着实际上没有记录任何内容。所以这是您没有收到任何错误的一个很好的理由。
  • 你能不能告诉我把这条线 log4j.rootLogger=DebugAppender 放在你给我指出的问题中
  • 我认为您通常是 log4j 或日志库的新手。我建议你先阅读thisthis

标签: java jasper-reports


【解决方案1】:

可能从错误的位置加载报告,尝试相对路径:

InputStream in = this.getClass().getResourceAsStream("reports/invoice.jrxml");

这意味着报告文件夹中有 invoice.jrxml,并且该文件夹与调用 getResourceAsStream 的类 (this.getClass()) 处于同一级别。

此外,您可以使用

绕过警告
org.apache.log4j.BasicConfigurator.configure();

在程序开始时。

【讨论】:

  • 我已经多次更改路径并通过消息对话框检查是否找到文件,找到文件并且指令在此方法之前停止 JRXmlLoader.load(in);运行编译后的 jar 但从 ide 运行时它可以正常工作
  • 尝试捕获所有异常并将异常消息打印到 System.err。尝试从命令行java -jar myjar.jar 运行以查看是否抛出任何 RuntimeException ?使用不同的类路径正常运行 fom NB 项目。
【解决方案2】:

不要直接运行 jar 文件。相反,从 命令行 使用 java -jar myjar.jar 运行它,正如 @PeterMmm 在上面的 cmets 中所说,您将看到列出的错误。尝试从中找出错误。我认为错误可能是NoClassDefFoundError,这是由于库文件的错误版本。如果是这个原因,请下载包含缺失类定义的正确版本的库 jar 文件,并将其添加到 项目库 并构建项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多