公司的使用irport配置xml生成.jasper 后缀文件然后组织数据进行pdf生成。该项目window环境下执行不报错,放在liunx服务器有时候会遇到代码卡住在JasperFillManager.fillReport 在这一句不动的情况,及不报错抛出错误也不往后执行。排查问题毫无头绪。
今天又遇到此问题,经过排查解决了该问题以下是排查过程
1、项目本身是5.6.0的 jasperreports maven包配置,怀疑是版本过低存此问题,为了验证我建立了一个新项目,在网上找了一篇文字进行了初步集成代码配置如下
maven配置增加一下配置
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-pdfa</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>cn.lesper</groupId>
<artifactId>iTextAsian</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.11</version>
</dependency>
<!-- jasperreports end-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.11.0</version>
</dependency>
测试样例代码
public static void main(String[] args) throws Exception {
test();
}
public static String test() throws JRException {
Map map = (Map<String, Object>)new HashMap();
List<Object> list = new ArrayList<>();
String T1 = "1";
String T2 = "2";
String T3 = "3";
String T4 = "4";// 余额
BigDecimal T5 = new BigDecimal("0");
log.error("取公共数据");
for (int i = 0; i < 10; i++) {
Irportbean detail=new Irportbean();
detail.setL1("1");//抄表时间 thisCopyDate
detail.setL2("2");//缴费日期 writeOffDate
detail.setL3("3");//上期行至preto
detail.setL4("4");//本期行至thisto
detail.setL5("5");//实用水量practicalWater
detail.setL6("6");//实收水量netReceiptsWater
detail.setL7("7");//用水单价basicsFeeUnitPrice
detail.setL8("8");//水费金额basicsFeeMoney
detail.setL9("9");//违约金lateFee
detail.setL10("已销账");//销账标志isWriteOff
list.add(detail);
}
JRDataSource data = new JRBeanCollectionDataSource(list);
map.put("beans", data);
map.put("T1", "测试");//户号
map.put("T2", T2);//表位号
map.put("T3", T3);//户名
map.put("T4", T4);//地址
map.put("T5", T5); //余额
log.error("---------------------------map :" + list.toString());
// 3、打印PDF
String imageName = UUID.randomUUID() + ".pdf";
log.error("==========");
log.error(PATH + "gr_water_list.jasper");
log.error(IAMGE_PATH + imageName);
JasperPrint print = JasperFillManager.fillReport(PATH + "gr_water_list.jasper", map, new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(print,IAMGE_PATH+imageName);
log.error("---------------------------getName :" + print.getName());
String url = YUMIN + "JxReport/temp_image/" + imageName;
log.error("---------------------------url :" + url);
return url;
}
该代码本地window执行OK,然后打包至问题服务器通过接口测试发现也能正常生成pdf,初步确认该文与服务器无关系,确认为版本问题。
确认是版本问题后进行了项目集成按照上面的配置集成到现有项目中打包测试。过程中还遇到两小问题
1、集成测试本地测试没问题,放到服务器发现还是不行,发现eclipse使用maven打包如果不事先更新maven并清理现有war的话它会把新版本的jar和老版本的jar一起打包至war中,需要清理项目maven。然后重新打包,现象:war启动后解压lib目录看新包和老jar是否同时存在,存在删除老的jar,重启项目发现问题解决。