java - 编译 jasper 报告时未解析的符号

标签 java jasper-reports

当我尝试使用 jasperreports 6.2.1 库编译在 jasper studio v6.2.0 中创建的 jrxml 文件时,出现以下错误:

net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
/home/david_clymer/Development/VistaShare/OutcomeTracker/HUD329902_1461778704578_563528.java:477: error: cannot find symbol
                value = CONCATENATE(((java.lang.String)field_ns058Agency_Physical_City.getValue()),",",((java.lang.String)field_ns058Agency_Physical_State.getValue()),"  ",((java.lang.String)field_ns058Agency_Ph
ysical_Zip.getValue())); //$JR_EXPR_ID=40$
                        ^
  symbol:   method CONCATENATE(String,String,String,String,String)
  location: class HUD329902_1461778704578_563528

...

9 errors
.
        at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:215)
        at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:357)
        at net.sf.jasperreports.engine.JasperCompileManager.compileToFile(JasperCompileManager.java:273)
        at net.sf.jasperreports.engine.JasperCompileManager.compileToFile(JasperCompileManager.java:232)
        at net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:542)
        at RunReport.compileReport(RunReport.java:80)
        at RunReport.main(RunReport.java:192)

如何确保这些函数已导入并可用?

这是我到目前为止所做的调试:

根据我的谷歌搜索,这是由于 java 类路径中缺少 jasperreports-functions-6.2.1.jar 造成的。然而,就我而言,它绝对是在类路径中,并且测试表明它的类是可以访问的,但方法却不是:

// Imports without error
import net.sf.jasperreports.functions.standard.TextFunctions;

public class Foo {
    public static void main(String[] args) {
        // Cannot resolve symbol INTEGER_VALUE
        Object foo = TextFunctions.INTEGER_VALUE;
    }
}

反编译相关类,发现该方法确实存在:

david_clymer@zapazoid:~/Development/VistaShare/OutcomeTracker/jasperreports/lib/tmp$ jar -xf ../jasperreports-functions-6.2.1.jar 
david_clymer@zapazoid:~/Development/VistaShare/OutcomeTracker/jasperreports/lib/tmp$ java -jar ../../../procyon-decompiler-0.5.30.jar net/sf/jasperreports/functions/standard/TextFunctions.class |grep -A 7 INTEGER_VALUE
    @Function("INTEGER_VALUE")
    @FunctionParameters({ @FunctionParameter("textNumber") })
    public static Integer INTEGER_VALUE(final String textNumber) {
        if (textNumber == null) {
            logNullTextString();
            return null;
        }
        return Integer.parseInt(textNumber);
    }

david_clymer@zapazoid:~/Development/VistaShare/OutcomeTracker/jasperreports/lib/tmp$ grep TextFunctions jasperreports_extension.properties 
net.sf.jasperreports.extension.functions.text=net.sf.jasperreports.functions.standard.TextFunctions

我并不是一个真正的java程序员,所以也许我在做一些愚蠢的事情。我只是不知道如何正确引用这些方法,以便我可以确定它们应该工作。

更新:使用静态导入:

import static net.sf.jasperreports.functions.standard.TextFunctions.*

允许将这些函数导入到当前命名空间中。

那么,回到最初的问题。如果在 jasperreports.properties 中设置 net.sf.jasperreports.compiler.keep.java.file=true 并尝试编译报告,我可以检查 jasper 从 jrxml 生成的 java 文件。我发现这个文件似乎没有导入必要的函数(INTEGER_VALUECONCATENATE 等)。它包含的唯一导入是:

/*
 * Generated by JasperReports - 4/27/16 2:27 PM
 */
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.fill.*;
import net.sf.jasperreports.functions.standard.TextFunctions.*;

import java.util.*;
import java.math.*;
import java.text.*;
import java.io.*;
import java.net.*;

最佳答案

symbol: method CONCATENATE(String,String,String,String,String)

问题似乎是 Java 编译器无法解析 varargs 调用,该方法定义为 CONCATENATE(String ...strings)。

将 ecj jar 添加到应用程序的类路径(例如 http://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/4.3.1/ 中的类路径),这通常比依赖 JDK 编译器更安全。

关于java - 编译 jasper 报告时未解析的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898385/

相关文章:

jasper-reports - Jasper 报告遍历数组列表

java - Jasper 和 .xlsx 的内容消息不可读

java - 可执行 Jar 在类路径上找不到 typesafe/config application.conf

java - 从 4.2.0.RC3 升级到 4.2.0.RELEASE 时出现 Spring Async 问题

java - 使用mq客户端获取Alias Queue的基础对象队列名

java - 在接口(interface)中使用 Java 泛型来强制实现以实现类型作为参数的方法

java - Jooq dsl 一对多关系

jasper-reports - 如何从 Jaspersoft/JRXML 生成双语标记 PDF 输出?

MYSQL SUM() 总分

java - 如何让 Jasper Reports 忽略文本字段中的换行符?