Jasperreports引擎JRRuntimeException on report()。show

时间:2016-05-25 14:29:08

标签: java jasper-reports dynamic-reports

我正在使用DynamicReports和JasperReports创建一个java应用程序。

在尝试显示JasperReportBuilder时,我收到此错误:

...
    DEBUG DefaultExtensionsRegistry - Instantiating extensions registry for system.f
    ont.families using factory class net.sf.dynamicreports.jasper.base.JasperSystemF
    ontExtensionsRegistryFactory
    Exception in thread "AWT-EventQueue-0" Exception in thread "AWT-EventQueue-0"
    Exception: net.sf.jasperreports.engine.JRRuntimeException thrown from the UncaughtExceptionHandler in thread "AWT-EventQueue-0"

我真的缺乏想法。我使用JDBC-ODBC桥来获取Access数据库(查询工作)。我的代码片段(基本上是动态创建报告和列):

JasperReportBuilder report = report();
            try{
                report.setTemplate(Templates.reportTemplate);
                StyleBuilder titleStyle = stl.style(boldCenteredStyle)
                        .setVerticalAlignment(VerticalAlignment.MIDDLE)
                        .setFontSize(15);

                report.title(cmp.horizontalList().add(cmp.image("resources/icon.jpg").setFixedDimension(80, 80)
                    , cmp.text("Gestion de rapports").setStyle(titleStyle)
                    , cmp.text(rapportSelect.getNomListe()).setStyle(titleStyle).setHorizontalAlignment(HorizontalAlignment.RIGHT))
                        .newRow().add(cmp.filler().setStyle(stl.style().setTopBorder(stl.pen2Point())).setFixedHeight(10)));

                Iterator it = rapportSelect.getMappingColonnes().entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry pair = (Map.Entry)it.next();
                    report.columns(col.column((String)pair.getKey(), (String)pair.getValue(), type.stringType()));
                }

                report.pageFooter(Templates.footerComponent);

                String sqlQuery = rapportSelect.getSqlQuery() + " ";

                Statement stmt = GestionDbAdapter.getInstance().get().createStatement();
                ResultSet rs = stmt.executeQuery(sqlQuery);
                report.setDataSource(rs);

                report.show(false);

整个应用程序非常大,所以我只放了一段我的代码(我稍微清理了stackoverflow)。如果您想要更多代码,请告诉我。

1 个答案:

答案 0 :(得分:1)

我假设你和我一样有类似的问题。我有2种部署(没有网络方案):

  1. 将所有相关JAR放在单独文件中的应用程序部署
  2. 将所有JAR打包到一个jar中的独立部署(“jar-with-dependencies”)
  3. 第二种情况没有正确执行,并在您所描述的同一位置以相同的错误中止。

    原因是几个依赖的JasperReport JAR在默认包级别的同一位置包含一个具有相同名称的属性文件:jasperreports_extension.properties

    在自包含的JAR场景中,它们互相覆盖。最后,只有一个jasperreports_extension.properties,因此工作的JasperReport缺少一些键值对。

    解决方法:

    收集所有jasperreports_extension.properties个文件,并将其内容汇总到一个jasperreports_extension.properties中。确保您的部署获得此特殊文件而不是原始文件。我在以下依赖工件中发现了重复的jasperreports_extension.properties个文件:

    • 的JasperReports-6.2.2.jar
    • 的JasperReports的字体-6.0.0.jar
    • dynamicreports核-4.1.1.jar
    • dynamicreports-googlecharts-4.1.1.jar