Gradle-jooq-plugin的generateJooq仅生成H2的information_schema类,不生成Liquibase表类
解决JOOQ仅生成information_schema类的问题
核心问题分析
- 数据库实例不统一:你的Spring Boot配置用的是内存H2数据库(
jdbc:h2:mem:jooqtest),而gradle-jooq-plugin连接的是本地文件H2数据库(jdbc:h2:~/jooqtest),两者是完全独立的数据库,JOOQ自然找不到Liquibase在内存库中创建的表。 - 任务执行顺序错误:
generateJooq任务没有依赖Liquibase的迁移任务,即使数据库统一,也会因为表还没创建就执行代码生成,导致无表可生成。 - 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
相关产品推荐
相关产品推荐

