You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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插件能更好地处理依赖资源的合并,避免文件冲突或丢失:

  1. 引入Shadow插件:
plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '8.1.1'
    id 'application'
}

application {
    mainClass = 'com.example.Main'
}

shadowJar {
    mergeServiceFiles() // 合并服务文件,确保JasperReports组件被正确加载
    mergeManifest()
}
  1. 执行./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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:18:20