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

Gradle-jooq-plugin的generateJooq仅生成H2的information_schema类,不生成Liquibase表类

解决JOOQ仅生成information_schema类的问题

核心问题分析

  1. 数据库实例不统一:你的Spring Boot配置用的是内存H2数据库(jdbc:h2:mem:jooqtest),而gradle-jooq-plugin连接的是本地文件H2数据库(jdbc:h2:~/jooqtest),两者是完全独立的数据库,JOOQ自然找不到Liquibase在内存库中创建的表。
  2. 任务执行顺序错误:generateJooq任务没有依赖Liquibase的迁移任务,即使数据库统一,也会因为表还没创建就执行代码生成,导致无表可生成。
  3. JOOQ未指定目标Schema:H2默认Schema是PUBLIC,如果JOOQ没有明确指定,可能只会扫描默认的INFORMATION_SCHEMA。

具体修复步骤

1. 统一数据库配置

修改build.gradle中JOOQ的JDBC URL,和application.properties保持一致,同时添加DB_CLOSE_DELAY=-1防止内存库提前关闭:

jooq {
    version.set("3.16.3")
    edition.set(nu.studer.gradle.jooq.JooqEdition.OSS)

    configurations {
        create("main") {
            generateSchemaSourceOnCompilation.set(true)

            jooqConfiguration.apply {
                jdbc.apply {
                    driver = "org.h2.Driver"
                    // 和application.properties一致的内存库配置
                    url = "jdbc:h2:mem:jooqtest;DB_CLOSE_DELAY=-1"
                    user = "db"
                    password = "db"
                }
                // ... 其他配置不变
            }
        }
    }
}

2. 添加Liquibase Gradle插件并配置迁移任务

在build.gradle的plugins块中加入Liquibase插件,同时配置迁移任务,让它和JOOQ使用同一个数据库:

plugins {
    java
    id("org.springframework.boot") version "3.0.2"
    id("io.spring.dependency-management") version "1.1.0"
    id("nu.studer.jooq") version "8.0"
    // 添加Liquibase Gradle插件
    id("org.liquibase.gradle") version "2.2.0"
}

// 配置Liquibase迁移任务
liquibase {
    activities {
        main {
            changeLogFile "src/main/resources/db/changelog/db.changelog-master.yaml"
            url "jdbc:h2:mem:jooqtest;DB_CLOSE_DELAY=-1"
            username "db"
            password "db"
            driver "org.h2.Driver"
        }
    }
}

3. 让generateJooq依赖Liquibase迁移任务

确保代码生成前先执行Liquibase创建表:

// 配置任务依赖
tasks.named('generateJooq').configure {
    dependsOn tasks.named('liquibaseMigrate')
}

4. 配置JOOQ指定目标Schema

修改JOOQ的database配置,明确指定要扫描的PUBLIC Schema,排除INFORMATION_SCHEMA:

generator.apply {
    name = "org.jooq.codegen.DefaultGenerator"
    database.apply {
        name = "org.jooq.meta.h2.H2Database"
        // 指定要生成的Schema
        inputSchema = "PUBLIC"
        // 包含所有表,排除INFORMATION_SCHEMA的表
        includes = ".*"
        excludes = "INFORMATION_SCHEMA.*"
        forcedTypes.addAll(listOf(
                org.jooq.meta.jaxb.ForcedType().apply {
                    name = "varchar"
                    includeExpression = ".*"
                    includeTypes = "JSONB?"
                },
                org.jooq.meta.jaxb.ForcedType().apply {
                    name = "varchar"
                    includeExpression = ".*"
                    includeTypes = "INET"
                }
        ))
    }
    // ... 其他配置不变
}

验证执行

运行./gradlew generateJooq,此时会先执行liquibaseMigrate创建表,再由JOOQ生成对应表的实体类,而不是只生成information_schema的内容。

内容的提问来源于stack exchange,提问作者Mykoliux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:05:48