我正在使用 JasperReports 4.7.1插件来 NetBeans 7.2 从mysql数据库生成报告 当我从ide运行应用程序时,没有问题发现接受此警告:
log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
log4j:WARN Please initialize the log4j system properly.
但报告生成并正确查看。
问题是,当我清理并构建应用程序然后从jar文件中将其从报告未生成时发出,并且没有给我任何例外,只是没有查看报告,其他一切都是正常的?
这是我用于在 JasperViewer 中查看报告的功能:
public void printInvoice(int invid) throws IOException {
try {
String sql = "SELECT\n" +
" ordersdetails.`ITEMNAME` AS ordersdetails_ITEMNAME,\n" +
" ordersdetails.`AMOUNT` AS ordersdetails_AMOUNT,\n" +
" ordersdetails.`PRICE` AS ordersdetails_PRICE,\n" +
" invoices.`INVOICEID` AS invoices_INVOICEID,\n" +
" invoices.`CUSTOMER` AS invoices_CUSTOMER,\n" +
" invoices.`THEDATE` AS invoices_THEDATE,\n" +
" invoices.`COST` AS invoices_COST\n" +
"FROM\n" +
" `invoices` invoices RIGHT OUTER JOIN `ordersdetails` ordersdetails ON invoices.`INVOICEID` = ordersdetails.`INVOICE` where invoices.invoiceid=" + invid;
InputStream in = this.getClass().getResourceAsStream("/reports/invoice.jrxml");
JasperDesign jd = JRXmlLoader.load(in);
JRDesignQuery q = new JRDesignQuery();
q.setText(sql);
jd.setQuery(q);
JasperReport jasp_rep = JasperCompileManager.compileReport(jd);
JasperPrint jasp_print = JasperFillManager.fillReport(jasp_rep, null, mc.getConnection());
JasperViewer.viewReport(jasp_print, false);
} catch (JRException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
System.out.println(e);
}
}
答案 0 :(得分:1)
可以从错误的位置加载报告,尝试相对路径:
InputStream in = this.getClass().getResourceAsStream("reports/invoice.jrxml");
这意味着报告文件夹中有invoice.jrxml,该文件夹与调用getResourceAsStream的类(this.getClass())处于同一级别。
另外,你可以用
来解决警告org.apache.log4j.BasicConfigurator.configure();
在你的课程开始时。
答案 1 :(得分:0)
请勿直接运行jar文件。而是从命令行使用java -jar myjar.jar
来运行它,如 @PeterMmm 在上面的注释中所述,您将看到列出的错误。尝试从中查找错误。我认为该错误可能是NoClassDefFoundError
,这是由于库文件的版本错误引起的。如果是这个原因,请下载包含缺少的类定义的库jar文件的正确版本,并将其添加到项目库并构建项目。