我正在开发一个简单的独立桌面应用程序,该应用程序将根据传递给程序的值生成报告.没有数据库使用情况.我已经使用iReport设计器设计了JasperReports报告,并添加了参数ID_NO和带有表达式$P {ID_NO}的文本字段
我可以成功预览报告,并查看期望的结果.但是我无法从Java应用程序生成报告并从那里传递参数ID_NO.这是我的代码:
public class MyReportViewer extends JFrame {
public MyReportViewer(String fileName) {
this(fileName,null);
}
public MyReportViewer(String fileName,HashMap<String, Object> parameter) {
super("View Report");
try {
JasperPrint print = JasperFillManager.fillReport(fileName, parameter);
JRViewer viewer = new JRViewer(print);
Container c = getContentPane();
c.add(viewer);
} catch(Exception e) {
e.printStackTrace();
}
setBounds(10, 10, 600,500);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
public static void main(String args[]) {
HashMap<String, Object> param = new HashMap<String, Object>();
param.put("ID_NO", "101-15-980");
MyReportViewer viewer = new MyReportViewer("test.jasper", param);
viewer.setVisible(true);
}
}
该代码给出了一个例外
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at net.sf.jasperreports.engine.util.JRLoader.<clinit>(JRLoader.java:61)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:267)
at jspertest.MyReportViewer.<init>(MyReportViewer.java:37)
at jspertest.MyReportViewer.main(MyReportViewer.java:60)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
并且不运行.
请给我一个线索.我以前从未使用过JasperReports或任何类型的报告生成器.
编辑:
将jasperreports4.x.x / lib / ..中的所有库文件添加到项目中.现在,异常消失了.现在控制台说-
log4j:WARN No appenders could be found for logger (net.sf.jasperreports.extensions.ExtensionsEnvironment).
log4j:WARN Please initialize the log4j system properly.
一个小的弹出窗口说文档中没有页面.出现一个小窗口,其中没有报告.
解决方法:
您的异常与参数问题无关,看起来很不错.
看来您在类路径中缺少Apache Commons Logging.它在预览模式下运行,因为您的IDE确实具有正确的类路径.