Birt createFactoryObject在示例不应为null时返回null

时间:2018-11-02 07:50:08

标签: groovy birt

我正尝试在此example之后使用Groovy创建一个简单的Birt报告。我不确定是否可以使用Groovy设计报表,但是我找不到解决方案。 据我了解,我认为不需要在3.7版之后设置BIRT_HOME。无论是否设置BIRT_HOME,我都会收到相同的错误。由于某种原因,createFactoryObject返回null,因此我无法使用createDesignEngine函数。我不确定是否需要获取另一个运行时版本,或者是否因为我正在使用Groovy而缺少其他导入。任何想法都值得赞赏。

import java.io.IOException;

@Grab(group='org.eclipse.birt.runtime', module='org.eclipse.birt.runtime', 
version='4.5.0a')

import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.report.model.api.CellHandle;
import org.eclipse.birt.report.model.api.DesignConfig;
import org.eclipse.birt.report.model.api.DesignElementHandle;
import org.eclipse.birt.report.model.api.DesignEngine;
import org.eclipse.birt.report.model.api.ElementFactory;
import org.eclipse.birt.report.model.api.GridHandle;
import org.eclipse.birt.report.model.api.IDesignEngine;
import org.eclipse.birt.report.model.api.IDesignEngineFactory;
import org.eclipse.birt.report.model.api.ImageHandle;
import org.eclipse.birt.report.model.api.LabelHandle;
import org.eclipse.birt.report.model.api.ReportDesignHandle;
import org.eclipse.birt.report.model.api.RowHandle;
import org.eclipse.birt.report.model.api.SessionHandle;
import org.eclipse.birt.report.model.api.activity.SemanticException;

import com.ibm.icu.util.ULocale;

/**
 * Simple BIRT Design Engine API (DEAPI) demo.
 */

        // Create a session handle. This is used to manage all open designs.
        // Your app need create the session only once.


        //Configure the Engine and start the Platform
        DesignConfig config = new DesignConfig( );

        //config.setProperty("BIRT_HOME", "C:\\birtruntime\\birt-runtime-4_5_0\\ReportEngine");
        IDesignEngine engine = null;
        try{


        Platform.startup( config );
        IDesignEngineFactory factory = (IDesignEngineFactory) 
        Platform.createFactoryObject( IDesignEngineFactory.EXTENSION_DESIGN_ENGINE_FACTORY );
        engine = factory.createDesignEngine( config );

        }catch( Exception ex){
            ex.printStackTrace();
        }       

这是我收到的错误

java.lang.NullPointerException: Cannot invoke method createDesignEngine() on null object
        at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:47)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:34)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)
        at sample.run(sample.groovy:42)
        at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:264)
        at groovy.lang.GroovyShell.run(GroovyShell.java:377)
        at groovy.lang.GroovyShell.run(GroovyShell.java:366)
        at groovy.ui.GroovyMain.processOnce(GroovyMain.java:589)
        at groovy.ui.GroovyMain.run(GroovyMain.java:332)
        at groovy.ui.GroovyMain.access$1400(GroovyMain.java:69)
        at groovy.ui.GroovyMain$GroovyCommand.process(GroovyMain.java:291)
        at groovy.ui.GroovyMain.processArgs(GroovyMain.java:134)
        at groovy.ui.GroovyMain.main(GroovyMain.java:116)
        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:498)
        at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:114)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:136)
Caught: java.lang.NullPointerException: Cannot invoke method newSessionHandle() on null object
java.lang.NullPointerException: Cannot invoke method newSessionHandle() on null object
        at sample.run(sample.groovy:49)

1 个答案:

答案 0 :(得分:0)

Evgeny建议将工厂创建内容放在一行上。当我在此处发布时,我没有意识到它是两行的。不管它是在我的源代码中的哪一行上,所以这不是问题。

我没有弄清楚如何使这段代码与groovy抓取命令一起工作,但是我确实使用classpath选项弄清楚了。首先,我在eclipse website上下载了运行时引擎。这将是报告引擎部分下的zip文件。您也许可以使用较新的版本,但我将其与4.5.0结合使用。

将此文件夹解压缩到某个位置,然后在ReportEngine \ lib文件夹中复制所有 org.eclipse jar和 flut com.ibm.icu org.mozilla.javascript 罐入一个单独的文件夹,例如C:\ birtJars。您也许可以使用更少的罐子,但是我不想花时间来找出不需要的罐子。我所知道的是,如果我将ReportEngin \ lib添加到类路径中,那么我认为是与某些Java类匹配的类名就会产生链接错误。

现在要使脚本在命令行中运行,您可以使用

groovy -cp "C:\birtJars\*;." myscript.groovy

一开始我不知道的是,如果您在常规脚本之后使用-cp,那么将不会使用给定的类路径