【问题标题】:Jasperreports engine JRRuntimeException on report().showJasperreports 引擎 JRRuntimeException on report().show
【发布时间】:2016-05-25 14:29:08
【问题描述】:

我正在使用 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 个单独的 JAR 中?恐怕 jasperreports_extension.properties 位于同一个地方的 1 个以上的 JAR 中,如果您将所有这些 JAR 合并到 1 个 JAR 中,那么这个属性文件会被覆盖。这意味着缺少某些属性。见:dynamicreports.org/forum/viewtopic.php?f=1&t=1388

标签: java jasper-reports dynamic-reports


【解决方案1】:

我假设您遇到了和我一样的问题。我有 2 种部署(无网络场景):

  1. 将所有相关 JAR 放在单独的文件中的应用程序部署
  2. 独立部署,将所有 JAR 打包到一个 jar 中(“jar-with-dependencies”)

第二种情况无法正确执行,并在您描述的同一位置出现相同的错误而中止。

原因是几个依赖的 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-fonts-6.0.0.jar
  • dynamicreports-core-4.1.1.jar
  • dynamicreports-googlecharts-4.1.1.jar

【讨论】:

  • 它对我有用。在我使用服务器作为库的项目中,我将 Jasper 的属性与我的属性连接起来,然后在我使用我的库的项目(不是 Web)中,我构建了带有依赖项的 jar,它运行良好。
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多