【问题标题】:jasperreports cannot compile with datetime functions - symbol not foundjasperreports 无法使用日期时间函数编译 - 找不到符号
【发布时间】:2018-06-13 18:29:03
【问题描述】:

Jasper 报告 6.5.1。在 Studio 中,我可以运行一个 textExpression 为“TODAY()”的报告。但是,在我的 Web 服务器应用程序中,嵌入了 jasperreports jar,我收到此错误:

error: cannot find symbol\r\n                value = TODAY( );

我导入了 DateTimeFunctions,并且该函数位于 java 类路径中,但我猜不是编译器。这就是我的代码,试图静态导入所需的函数:

def c = new DateTimeFunctions()
def x = c.TODAY()

JRXmlLoader loader = new JRXmlLoader(new SimpleJasperReportsContext(), new Digester())
JasperDesign designFile = loader.load(sourceFilePath)

// Ensure that custom functions are available when compiling reports.
designFile.addImport("static net.sf.jasperreports.functions.standard.TextFunctions.*")
designFile.addImport("static net.sf.jasperreports.functions.standard.MathFunctions.*")
designFile.addImport("static net.sf.jasperreports.functions.standard.LogicalFunctions.*")
designFile.addImport("static net.sf.jasperreports.functions.standard.DateTimeFunctions.*")

JasperReport jasperReport = JasperCompileManager.compileReport(designFile)

我可以编译其他 jrxml 文件,但其中包含 TODAY() 的文件会引发异常。我怀疑所有静态导入都是这种情况,但我什至无法超越 TODAY() 问题。请注意,日期时间 jar 在 java 类路径中,因为我可以调用 TODAY() 作为测试。

源文件是 groovy;不确定这是否与静态导入混淆,或者问题是什么。有什么帮助吗?

感谢 Alex K 的回复,确认不应该发生任何神秘事件。我认为我不需要 groovy-all,因为我不是在 groovy 中编写脚本,只是源文件在 groovy 中。我查看了为 JasperCompileManager 生成的 java 代码并查看

import static net.sf.jasperreports.functions.standard.DateTimeFunctions.*;

在我看到的 evaluate() 方法中

case 9 : 
{
    value = TODAY( ); //$JR_EXPR_ID=9$
    break;
}

但是,仍然找不到 TODAY() 方法。我会将 groovy 文件重写为 java 文件,以查看 groovy 是否搞砸了。例如,所有大写的方法名称可能是一个问题。或编译器版本 - 在 1.8 下运行。无论如何,抓住稻草,但会努力维持下去。

======================

好的,我创建了一个 java 测试文件来看看为什么我无法解析“TODAY()”。在这里,使用从 jrxml 文件的 java 代码中生成的静态导入:

import java.util.Date;
import static net.sf.jasperreports.functions.standard.DateTimeFunctions.*;

class Test {
  Date dtest() {
    return TODAY();
  }

  public static void main(String[] args) {
    Test t = new Test();
    Date d = t.dtest();
    System.out.println(d);
  }
}

编译它给出:

javac -cp ./jasperreports-6.5.1.jar;./jasperreports-functions-6.5.1.jar Test.java
Test.java:6: error: cannot find symbol
            return TODAY();
                   ^
symbol:   method TODAY()
location: class Test
1 error

好吧,我的 Java 技能不是最好的,所以我在这里缺少什么?我正在使用 java 版本“1.8.0_171”进行编译。

我可以完成这项工作的唯一方法是将静态导入的方法声明为“公共静态”。也就是说,

public static Date TODAY() { ...

但这不是 DateTimeFunctions.java 源代码中的内容。

===========================

所以,如果我在这里阅读 6.6.0 文档:http://jasperreports.sourceforge.net/sample.reference/functions/index.html,示例 DateTimeFunctions 都被声明为静态,在我看来这是正确的。那么,我是否为 6.5.1 和 6.6.0 下载了伪造的函数 jar,而“真实”的 jar 是否还有待发现?

【问题讨论】:

  • 你把我弄糊涂了 :) 你有 jrxml 或 groovy 代码的问题吗? For instance, maybe the method name in all caps is a problem - 大写的方法名称。你用的是什么版本的JR?你的情况不清楚
  • jrxml 没有问题,它在 Studio 和 Reports Server 中运行良好,但是当我将 jar 嵌入到 groovy 文件(Grails 插件)中时失败。它无法解析 TODAY 函数。然而,导入存在于 java 类路径中。不,我不相信这是因为方法名称都是大写的。

标签: groovy compilation jasper-reports


【解决方案1】:

如果在模板中使用 groovy 语言并具有 org.codehaus.groovy:groovy-allnet.sf,则无需添加导入.jasperreports:jasperreports-functions 类路径中的库。

这个 jrxml 工作正常:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="TODAY using" whenNoDataType="AllSectionsNoDetail" language="groovy">
    <title>
        <band height="60">
            <textField>
                <reportElement x="0" y="30" width="100" height="30"/>
                <textFieldExpression><![CDATA[TODAY()]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

依赖关系:

<dependencies>
    <!-- some dependencies -->

    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>6.5.1</version>
    </dependency>

    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.0.1</version>
    </dependency>

    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports-functions</artifactId>
        <version>5.2.0</version>
    </dependency>
</dependencies>

这同样适用于默认的java语言。


静态导入也在 JasperReports 中工作。

使用Guava库中的一些方法的例子:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Static import" whenNoDataType="AllSectionsNoDetail">
    <import value="static com.google.common.base.Strings.repeat"/>
    <title>
        <band height="60">
            <textField>
                <reportElement x="0" y="30" width="200" height="30"/>
                <textFieldExpression><![CDATA[repeat("a", 3)]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

生成的结果将是:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多