java - net.sf.jasperreports.engine.JRRuntimeException : Function MONTH not found

标签 java groovy jasper-reports

我正在开发一个桌面应用程序,用于使用 Java Swing 和 Jasper Reports 生成报告。几天前,我遇到了一个问题,因为我的代码无法找到 Groovy 函数。我发现this answer问题得到了解决(请注意,我留下了评论),但是当我打包我的应用程序并尝试从控制台运行它时,我遇到了同样的问题。这是堆栈跟踪:

net.sf.jasperreports.engine.JRRuntimeException: Function MONTH not found.
    at net.sf.jasperreports.compilers.GroovyEvaluator.functionCall(GroovyEvaluator.java:106)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174)
    at subReporteSummary_1502405767221_591326.methodMissing(calculator_subReporteSummary_1502405767221_591326:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaClassImpl.invokeMissingMethod(MetaClassImpl.java:939)
    at groovy.lang.MetaClassImpl.invokePropertyOrMissing(MetaClassImpl.java:1262)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1215)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
    at subReporteSummary_1502405767221_591326.evaluateEstimated(calculator_subReporteSummary_1502405767221_591326:336)
    at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:342)
    ... 14 more

但是当我检查 jar 时,我能够找到 MONTH函数,位于 net.sf.jasperreports.functions.standard.DateTimeFunctions

@Function("MONTH")
@FunctionParameters({
    @FunctionParameter("dateObject")})
public static Integer MONTH(Object dateObject){
    return getCalendarFieldFromDate(dateObject,Calendar.MONTH)+1;
}

来自jasperreports-functions包位于我的类路径中并添加到包中,正如您可能通过我的 Maven 配置注意到的那样

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <repositories>
        <!-- Jasper Reports repository to get japerreports-functions -->
        <repository>
            <id>jr-ce-releases</id>
            <url>http://jaspersoft.artifactoryonline.com/jaspersoft/jr-ce-releases</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.4.0</version>
            <!-- Exclusions to avoid some JasperReports certificates problems -->
            <exclusions>
                <exclusion>
                    <groupId>org.bouncycastle</groupId>
                    <artifactId>bcmail-jdk14</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>bouncycastle</groupId>
                    <artifactId>bcmail-jdk14</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.bouncycastle</groupId>
                    <artifactId>bctsp-jdk14</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>bouncycastle</groupId>
                    <artifactId>bcprov-jdk14</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Groovy functions for Jasper Reports-->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-functions</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.12</version>
        </dependency>

        <!-- Driver needed to connect to the DB -->
        <dependency>
            <groupId>com.ibm.informix</groupId>
            <artifactId>jdbc</artifactId>
            <version>4.10.8.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- This is to include all my dependencies in my package (it works fine) -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>ar.edu.unt.gui.MainFrame</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>

        <resources>
            <resource>
                <!-- I don't want to package the reports' source file -->
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>*.jrxml</exclude>
                </excludes>
            </resource>
        </resources>
    </build>
</project>

MONTH从子报表调用函数。我发现this post在 Jaspersoft 社区,但我的报告没有这样的 <returnValue>标签。这是主报表中声明子报表的片段:

<summary>
    <band height="239" splitType="Stretch">
        <subreport>
            <reportElement x="0" y="0" width="469" height="200" uuid="2da4b923-ee34-4a6d-9a04-8d050a2feb0f"/>
            <subreportParameter name="NRO_PAGINAS_PADRE">
                <subreportParameterExpression><![CDATA[$V{PAGE_NUMBER}]]></subreportParameterExpression>
            </subreportParameter>
            <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
            <subreportExpression><![CDATA["subReporteSummary.jasper"]]></subreportExpression>
        </subreport>
        <textField evaluationTime="Auto">
            <reportElement x="175" y="219" width="126" height="20" uuid="28a4ff7e-d6dd-47f5-a655-5e0ea7bec50b"/>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA["- Página " + $V{NRO_PAGINA_ACTUAL} + " de " + $V{PAGE_NUMBER} + " -"]]></textFieldExpression>
        </textField>
    </band>
</summary>

这是subReporteSummary.jrxml (西类牙语中的 summarySubreport)调用 MONTH 函数的片段:

<variable name="NOMBRE_MES" class="java.lang.String" resetType="None">
    <variableExpression><![CDATA[MONTH($F{fechacancelacion}) == 1? "Enero" :
    MONTH($F{fechacancelacion}) == 2? "Febrero" :
    MONTH($F{fechacancelacion}) == 3? "Marzo" :
    MONTH($F{fechacancelacion}) == 4? "Abril" :
    MONTH($F{fechacancelacion}) == 5? "Mayo" :
    MONTH($F{fechacancelacion}) == 6? "Junio" :
    MONTH($F{fechacancelacion}) == 7? "Julio" :
    MONTH($F{fechacancelacion}) == 8? "Agosto" :
    MONTH($F{fechacancelacion}) == 9? "Septiembre" :
    MONTH($F{fechacancelacion}) == 10? "Octubre" :
    MONTH($F{fechacancelacion}) == 11? "Noviembre" : "Diciembre"]]></variableExpression>
    <initialValueExpression><![CDATA[MONTH($F{fechacancelacion}) == 1? "Enero" :
    MONTH($F{fechacancelacion}) == 2? "Febrero" :
    MONTH($F{fechacancelacion}) == 3? "Marzo" :
    MONTH($F{fechacancelacion}) == 4? "Abril" :
    MONTH($F{fechacancelacion}) == 5? "Mayo" :
    MONTH($F{fechacancelacion}) == 6? "Junio" :
    MONTH($F{fechacancelacion}) == 7? "Julio" :
    MONTH($F{fechacancelacion}) == 8? "Agosto" :
    MONTH($F{fechacancelacion}) == 9? "Septiembre" :
    MONTH($F{fechacancelacion}) == 10? "Octubre" :
    MONTH($F{fechacancelacion}) == 11? "Noviembre" : "Diciembre"]]></initialValueExpression>
</variable>

简单地说:fechacancelacionjava.util.Date变量和表达式用于获取大写的月份名称(这是必需的),我无法使用 DATEFORMAT 获得该名称。函数,因为它只给我小写的名称。

但是回到问题并总结一下,我有MONTH函数在我的 JAR 中可用,当我从 IDE (Netbeans) 运行应用程序时,报告会编译并正确显示,但从控制台运行时出现错误 java -jar myapp-1.0.jar来自target文件夹。

如果您需要任何其他证据,请将其注释掉。任何帮助将不胜感激。预先感谢您的回答

最佳答案

如果您使用 Maven Shade 插件来打包您的 jar,则必须按照 here 的描述合并所有 jar 中的 jasperreports_extension.properties以便正确注册 JasperReports 扩展(例如函数)。

关于java - net.sf.jasperreports.engine.JRRuntimeException : Function MONTH not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45766193/

相关文章:

multithreading - 如何在 groovy 中使用多线程访问 1000 个端点?

java - 在 XPath 1.0 中将整数转换为 double

java - 贾斯珀报告 : wrong positioning of text fields in Internet Explorer

java - 两个线程可以同时访问一个同步方法吗?

java - 发生NumberFormatException时如何打印?

java - 找到相交轨迹的最佳方法

grails - PooledConnection 已关闭

java - JPA/Hibernate 不存储@MapKeyColumn 的值

groovy - Groovy 中的final 是什么意思

java - JasperReports 报告未在 Spring MVC 应用程序中弹出