Spring Boot集成JasperReports生成Base64 PDF报错求助
问题解决方案
一、解决JasperReports 6.12.2的ClassNotFoundException(net.sf.jasperreports.compilers.ReportExpressionEvaluationData)
这个错误源于编译依赖缺失或版本与Java17/21不兼容:
- 优先升级JasperReports到6.20.0及以上版本,该版本对Java17/21支持更完善,彻底规避旧版本的高Java版本兼容问题。
- 若坚持使用6.12.2,需补充引入编译相关依赖,Maven配置示例:
<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports-compilers-java</artifactId> <version>6.12.2</version> </dependency>
二、解决JasperReports 6.13.0的FileNotFoundException(找不到类路径下的pdf.jasper)
针对资源找不到问题,从以下维度排查:
修正资源加载方式
避免用File类直接加载(jar包内文件无法通过File访问),改用类路径流加载:// 加载JRXML直接编译 InputStream jrxmlStream = getClass().getResourceAsStream("/pdf.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport(jrxmlStream); // 若已预编译为jasper文件 InputStream jasperStream = getClass().getResourceAsStream("/pdf.jasper"); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperStream);注意路径前缀
/代表类路径根目录,若文件在子目录(如src/main/resources/reports/),路径需写成/reports/pdf.jasper。确保JRXML已编译为Jasper文件
若依赖预编译的jasper文件,可通过Maven插件自动编译:<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jasperreports-maven-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <goals> <goal>compile-reports</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.13.0</version> </dependency> </dependencies> </plugin>插件会自动编译
src/main/resources下的JRXML文件,打包时将jasper文件放入类路径。检查资源打包情况
打包成jar后,执行jar tf your-app.jar查看pdf.jasper或pdf.jrxml是否在BOOT-INF/classes/目录下;若不在,确认src/main/resources被Maven/Gradle标记为资源目录,未被排除打包。
三、通用开发建议
- 版本适配:Spring Boot3+搭配Java17/21时,优先选择JasperReports 6.20.0+版本,避免版本兼容坑。
- 数据库驱动:PostgreSQL驱动使用
org.postgresql:postgresql:42.6.0及以上版本,确保与Java17兼容。 - 调试技巧:资源找不到时,打印类路径根目录确认资源位置:
URL rootPath = getClass().getResource("/"); System.out.println("类路径根目录:" + rootPath.getPath());
内容的提问来源于stack exchange,提问作者Rookie
相关产品推荐
相关产品推荐

