当示例不应该有 null 时,Birt createFactoryObject 返回 null
Birt createFactoryObject returning null when the example shouldn't have a null
我正在尝试使用 Groovy 创建一个简单的 Birt 报告,在此 example 之后。我不确定是否可以使用 Groovy 设计报告,但我一直没能找到解决方案。
根据我的理解,我认为我不需要在 3.7 版之后设置 BIRT_HOME。无论是否设置 BIRT_HOME,我都会收到相同的错误。由于某种原因 createFactoryObject returns 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.access00(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)
Evgeny 建议将工厂创建放在一行中。当我在这里发布它时,我没有意识到它在 2 行上。不管它在我的源代码中是在一行上,所以这不是问题。
我没有弄清楚如何让这段代码与 groovy grab 命令一起工作,但我确实使用 classpath 选项弄清楚了。首先,我在 eclipse website 上下载了 运行 时间引擎。它将是 Report Engine 部分下的 zip 文件。您也许可以使用较新的版本,但我让它可以与 4.5.0 一起使用。
将此文件夹解压缩到某个地方,然后在 ReportEngine\lib 文件夹中复制所有 org.eclipse jar 以及 flute、com.ibm.icu 和 org.mozilla.javascript 将 jars 放入单独的文件夹中,例如 C:\birtJars。您也许可以使用更少的罐子,但我不想花时间弄清楚哪些不需要。我所知道的是,如果我将 ReportEngin\lib 添加到 class 路径,那么我假设的 class 名称与某些 java class 匹配,将会出现链接错误es.
现在要在命令行中获取 运行 的脚本,您可以使用
groovy -cp "C:\birtJars\*;." myscript.groovy
一开始我不知道的是,如果您在 groovy 脚本之后使用 -cp,那么给定的 class 路径将不会被使用
我正在尝试使用 Groovy 创建一个简单的 Birt 报告,在此 example 之后。我不确定是否可以使用 Groovy 设计报告,但我一直没能找到解决方案。 根据我的理解,我认为我不需要在 3.7 版之后设置 BIRT_HOME。无论是否设置 BIRT_HOME,我都会收到相同的错误。由于某种原因 createFactoryObject returns 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.access00(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)
Evgeny 建议将工厂创建放在一行中。当我在这里发布它时,我没有意识到它在 2 行上。不管它在我的源代码中是在一行上,所以这不是问题。
我没有弄清楚如何让这段代码与 groovy grab 命令一起工作,但我确实使用 classpath 选项弄清楚了。首先,我在 eclipse website 上下载了 运行 时间引擎。它将是 Report Engine 部分下的 zip 文件。您也许可以使用较新的版本,但我让它可以与 4.5.0 一起使用。
将此文件夹解压缩到某个地方,然后在 ReportEngine\lib 文件夹中复制所有 org.eclipse jar 以及 flute、com.ibm.icu 和 org.mozilla.javascript 将 jars 放入单独的文件夹中,例如 C:\birtJars。您也许可以使用更少的罐子,但我不想花时间弄清楚哪些不需要。我所知道的是,如果我将 ReportEngin\lib 添加到 class 路径,那么我假设的 class 名称与某些 java class 匹配,将会出现链接错误es.
现在要在命令行中获取 运行 的脚本,您可以使用
groovy -cp "C:\birtJars\*;." myscript.groovy
一开始我不知道的是,如果您在 groovy 脚本之后使用 -cp,那么给定的 class 路径将不会被使用