当我尝试使用 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_VALUE
、CONCATENATE
等)。它包含的唯一导入是:
/*
* 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/