运行JAR时JasperReports无法定位相关包,IDE中运行正常
解决JasperReports 7.0.0 + SpringBoot 3.2.5 + JDK17打包JAR后找不到类的问题
可能的原因及对应解决方案:
1. 依赖配置错误,导致Jasper类未被打包进Fat Jar
- 确保Maven/Gradle中JasperReports的依赖范围为
compile(Maven)或implementation(Gradle),而非provided或test:
Maven示例:
Gradle示例:<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>7.0.0</version> <!-- 不要设置为provided,否则打包时不会包含该依赖 --> <scope>compile</scope> </dependency>implementation 'net.sf.jasperreports:jasperreports:7.0.0' - 检查是否存在依赖排除规则,避免不小心移除了JasperReports的核心模块。
2. SpringBoot打包插件未正确包含Jasper类
- 若使用
spring-boot-maven-plugin,确保插件配置中没有排除Jasper相关包,必要时添加显式的include规则:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.2.5</version> <configuration> <includes> <include> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> </include> </includes> </configuration> </plugin> - 执行
mvn clean package(或Gradle的./gradlew clean bootJar)重新打包,避免缓存导致的依赖缺失。
3. JDK17模块化限制导致类无法访问
JasperReports 7.0.0可能未适配JDK17的模块化系统,启动JAR时需要添加VM参数解除相关限制:
java --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED -jar your-project.jar
若仍有问题,可尝试添加更多开放模块:
java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED -jar your-project.jar
4. 报表编译生成的类未被打包
如果项目中存在编译后的Jasper报表类(如JREvaluator、JRFillField的实现类),确保这些类位于src/main/java或target/classes目录下,且打包过程中被包含进JAR。可直接解压JAR包检查net/sf/jasperreports/engine路径下是否存在对应类文件。
5. 清理依赖缓存,确保依赖一致性
- Maven:执行
mvn clean install -U强制更新依赖并重新构建 - Gradle:执行
./gradlew clean build --refresh-dependencies清理缓存并拉取最新依赖
内容的提问来源于stack exchange,提问作者Prashant Palve
相关产品推荐
相关产品推荐

