编译时出现Jasper Report语法错误

时间:2017-10-22 13:29:10

标签: java netbeans java-8 jasper-reports ireport

  • Jasper报告 - Netbeans最新的ireport插件(plugin for 7.4
  • JDK - 1.8
  • Netbeans 8.2

我在jrxml文件中使用java 8流。流函数在jrxml之外工作正常,当我编译报告时它给出了以下错误:

<variableExpression><![CDATA[$F{memberLoans}.stream()
.sorted(java.util.Comparator.comparing(p -> p.getId()))
.filter(p -> !p.isIsComplete()).filter(p -> p.isStatus())
.filter(com.court.handler.FxUtilsHandler.distinctByKey(p -> p.getMemberLoanCode()))
.collect(java.util.stream.Collectors.toList())]]></variableExpression>

这是我的变量表达式:

{{1}}

我已经将我的应用程序jar和最新的jdt-compiler jar添加到类路径中,并将源代码更改为1.8,但它仍然给出了上述错误。

Image_1

Image_2

任何建议都会非常有用。谢谢。

2 个答案:

答案 0 :(得分:2)

我尝试用新版本的 jtd编译器(由JasperReports 6.3使用)替换 iReport 使用的 jtd编译器

iReport 的最新版本是 5.6.0 ,它在场景后面使用 JasperReports 5.6.0

JasperReports 5.6 正在使用 jdt 3.1 ,你可以在 pom.xml找到这种依赖

<dependency>
    <groupId>eclipse</groupId>
    <artifactId>jdtcore</artifactId>
    <version>3.1.0</version>
    <scope>compile</scope>
</dependency>

这意味着 JasperReports API 使用的是不支持 Java 8 的旧版 jdt

例如, net.sf.jasperreports.engine.design.JRJdtCompiler 类正在使用 jdt 核心。这意味着 jdt API 的更改可能会破坏编译机制。

尽管有这些事实,我继续我的实验并用新版本替换 jdt 4.3.1 (此版本由JasperReports 6.3使用)。此版本允许我们在模板中使用 Java 8 语法。

我还在 iReport 设置了属性:

org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.source=1.8

但是我在通过 iReport 编译模板( jrxml )时得到了错误(正如预期的那样):

java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.CompilationResult.getErrors()[Lorg/eclipse/jdt/core/compiler/IProblem;     
at com.jaspersoft.ireport.designer.compiler.ExtendedJRJdtCompiler$CompilerRequestor.acceptResult(ExtendedJRJdtCompiler.java:96)     
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:480)     
at net.sf.jasperreports.engine.design.JRJdtCompiler.compileUnits(JRJdtCompiler.java:167)     
at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:201)     
at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:512)   

这意味着我的尝试失败,因为 jdt API 在新版本中已更改。但是 JasperReports API 仍然使用“旧”方法而不是新 jdt.jar 中的方法。

我看到的解决方案:

  1. 停止使用不受支持的 IDE 并将其替换为 Jaspersoft Studio
  2. 不要在 IDE iReport )上使用编译,并尝试使用 Java 代码编译/测试报告。
  3. 更多信息:

    Use lambda expressions inside TextField expression in Jaspersoft Studio 6.3

    How to use lambda expression in jrxml file?

答案 1 :(得分:0)

更新JDK您的计算机(y) 烧烤1.5-beta1罐无法编译所有jdk!