2013-04-30 105 views
2

我正在使用JasperReports 5.0.0在我的Java应用程序中生成报告。
当我加载&编译报告从.jrxml文件它没有问题。
但是,当我尝试从编译报告(.jasper文件)中加载它们时,它会在没有任何异常的情况下停止操作!
我包围JasperFillManager.fillReport声明与赶上Throwable这样的try语句:JasperReports填充编译报告时隐藏的异常

jasperReport = (JasperReport) JRLoader.loadObject(new FileInputStream(new File(Main.jarpath,Main.REPORT_TEMPLATE))); 
try{ 
    jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JRBeanCollectionDataSource(data)); 
}catch(Throwable ex){ 
    ex.printStackTrace(); 
} 

现在打印此异常:

java.lang.NoSuchMethodError: groovy.lang.MetaClassImpl.createPogoCallCurrentSite(Lorg/codehaus/groovy/runtime/callsite/CallSite;Ljava/lang/Class;[Ljava/lang/Object;)Lorg/codehaus/groovy/runtime/callsite/CallSite; 
     at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallCurrentSite(CallSiteArray.java:108) 
     at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49) 
     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) 
     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141) 
     at pe_report_1367344395908_105126.customizedInit(calculator_pe_report_1367344395908_105126:87) 
     at net.sf.jasperreports.engine.fill.JREvaluator.init(JREvaluator.java:88) 
     at net.sf.jasperreports.engine.fill.JRCalculator.init(JRCalculator.java:111) 
     at net.sf.jasperreports.engine.fill.JRFillDataset.initCalculator(JRFillDataset.java:469) 
     at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:529) 
     at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:88) 
     at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:103) 
     at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:61) 
     at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:153) 
     at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:82) 
     at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653) 
     at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:969) 
     at pe.reporting$1.doInBackground(reporting.java:75) 
     at pe.reporting$1.doInBackground(reporting.java:41) 
     at javax.swing.SwingWorker$1.call(SwingWorker.java:278) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
     at javax.swing.SwingWorker.run(SwingWorker.java:317) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:619) 

问题是什么?

回答

2

这是一个与groovy jar有关的类路径问题。如果你使用groovy来表达你需要将groovy jar添加到你的类路径中。

要找到你所需要的简单的方法是将一个:

如果你不使用你的报告时髦,你可以简单地删除language atrribute在jasperreport的XML标记在JRXML干脆。这个(至少在旧版本中)默认它用于表达式的java用法。

+0

是的,我使用它,但它是在classpath(我有'groovy-all-1.5.5.jar');之后,当我不使用预编译报告时,它没有问题! (使用'.jrxml'并在运行时编译它)我在groovy中使用我的应用程序方法(在报告中)有可能是问题(我的应用程序类不在groovy的类路径中) – RYN 2013-04-30 20:15:15

+0

@ 4r1y4n对于JasperReports 5.0, 0它说它需要'groovy-all-2.0.1.jar',所以我唯一能想到的是,你基本上是使用iReport编译报表,它使用的是比你用来试图运行的更新版本的groovy它。所以对我而言,基本上版本不匹配是最可能的罪魁祸首。 – 2013-04-30 20:28:57

+0

另一种选择是编译应用程序中的jrxml,并查看是否有效。如果是这样,也许作为你的构建的一部分,你可以预编译你想要的报告,并以这种方式处理。虽然它看起来比更新jar更多的工作。 – 2013-04-30 20:31:45