JasperReports打包Jar后报错:未注册SQL查询执行器工厂
解决JasperReports打包Jar后"sql语言无查询执行器工厂注册"的问题
针对开发环境正常、打包Jar后出现net.sf.jasperreports.engine.JRRuntimeException: No query executer factory registered for the 'sql' language的问题,结合Gradle构建和IntelliJ环境,提供以下几种可行方案:
方案1:程序启动时手动注册查询执行器工厂
绕过配置文件加载环节,直接在主类初始化时设置JasperReports属性,强制注册SQL查询执行器:
import net.sf.jasperreports.engine.query.JRJdbcQueryExecuterFactory; import net.sf.jasperreports.engine.util.JRProperties; public class Main { public static void main(String[] args) { // 手动注册SQL查询执行器工厂 JRProperties.setProperty( "net.sf.jasperreports.query.executer.factory.sql", JRJdbcQueryExecuterFactory.class.getName() ); // 执行报表生成逻辑... } }
这种方式无需依赖配置文件,直接通过代码确保属性生效,避免打包时配置文件丢失或加载失败的问题。
方案2:Gradle打包时确保配置文件被正确包含
如果希望依赖JasperReports默认的配置文件,可修改build.gradle,确保依赖中的default.jasperreports.properties被合并到最终Jar中:
plugins { id 'java' id 'application' } application { mainClass = 'com.example.Main' } jar { // 从依赖Jar中提取并包含default.jasperreports.properties from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } include '**/default.jasperreports.properties' // 若使用自定义配置,可在src/main/resources下创建jasperreports.properties // 写入:net.sf.jasperreports.query.executer.factory.sql=net.sf.jasperreports.engine.query.JRJdbcQueryExecuterFactory // 然后开启下面的配置 // from sourceSets.main.resources }
执行./gradlew jar打包后,检查Jar内是否存在该配置文件,确保JasperReports能读取到属性。
方案3:使用Shadow插件构建可执行Jar
如果是生成可执行Jar,Shadow插件能更好地处理依赖资源的合并,避免文件冲突或丢失:
- 引入Shadow插件:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '8.1.1' id 'application' } application { mainClass = 'com.example.Main' } shadowJar { mergeServiceFiles() // 合并服务文件,确保JasperReports组件被正确加载 mergeManifest() }
- 执行
./gradlew shadowJar生成可执行Jar,该Jar会自动处理依赖中的配置文件和类,解决加载问题。
方案4:确认依赖完整性
确保Gradle依赖中包含JasperReports的JDBC查询模块,部分版本可能需要单独引入:
dependencies { implementation 'net.sf.jasperreports:jasperreports:6.20.0' // 明确引入JDBC查询模块,确保JRJdbcQueryExecuterFactory类存在 implementation 'net.sf.jasperreports:jasperreports-jdbc:6.20.0' }
内容的提问来源于stack exchange,提问作者MarceloSouza
相关产品推荐
相关产品推荐

