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

如何在Gradle插件中配置jOOQ审计列?

解决jOOQ审计列配置在Gradle中的版本兼容问题

我正在编写Demo验证jOOQ 3.17新增的审计列特性,只需配置last_modified(timestamptz类型)和last_modifier(整数ID类型)两个字段。

根据官方文档,我在jooq-codegen模块的build.gradle.kts中做了如下配置:

import org.jooq.meta.jaxb.ForcedType
import org.jooq.meta.jaxb.Logging

plugins {
    id("nu.studer.jooq") version "7.1.1"
}

val jooqGroup by extra{"org.jooq.trial-java-8"}
val jooqVersion by extra{"3.17.3"}

dependencies {
    api("$jooqGroup:jooq:$jooqVersion")
    implementation("$jooqGroup:jooq-codegen:$jooqVersion")
    implementation("$jooqGroup:jooq-meta:$jooqVersion")
    jooqGenerator("org.postgresql:postgresql:42.4.2")
    runtimeOnly("org.postgresql:postgresql:42.4.2")
}

jooq {
    version.set(jooqVersion)
    edition.set(nu.studer.gradle.jooq.JooqEdition.TRIAL_JAVA_8)

    configurations {
        create("poc") {
            generateSchemaSourceOnCompilation.set(false)

            jooqConfiguration.apply {
                logging = Logging.WARN
                jdbc.apply {
                    driver = "org.postgresql.Driver"
                    url = "jdbc:postgresql://localhost:5432/mydemo"
                    user = "foo"
                    password = "bar"
                }
                generator.apply {
                    name = "org.jooq.codegen.DefaultGenerator"
                    database.apply {
                        name = "org.jooq.meta.postgres.PostgresDatabase"
                        inputSchema = "public"
                        forcedTypes.addAll(listOf(
                            ForcedType().apply {
                                name = "varchar"
                                includeExpression = ".*"
                                includeTypes = "JSONB?"
                            },
                            ForcedType().apply {
                                name = "varchar"
                                includeExpression = ".*"
                                includeTypes = "INET"
                            },
                            ForcedType().apply {
                                auditUpdateUser = true
                                name = "int"
                                includeExpression = "last_modifier"
                            },
                            ForcedType().apply {
                                auditUpdateTimestamp = true
                                name = "timestamptz"
                                includeExpression = "last_modified"
                            }
                        ))
                    }
                    generate.apply {
                        isPojos = false
                        isDaos = false
                        isRecords = true
                        isDeprecated = false
                    }
                    target.apply {
                        packageName = "my.app.jooq"
                        directory = "src/main/java"
                    }
                    strategy.name = "org.jooq.codegen.DefaultGeneratorStrategy"
                }
            }
        }
    }
}

但配置中的auditUpdateUser和auditUpdateTimestamp均提示:

Unresolved reference


经排查,问题根源是导入的org.jooq.meta.jaxb.ForcedType是3.16.4版本,而非我指定的3.17.3。推测原因是nu.studer.jooq插件最新版本仅支持到jOOQ 3.16.4,导致依赖冲突。

按照社区建议,我在脚本开头添加以下代码强制使用指定的jOOQ版本:

buildscript {
    configurations["classpath"].resolutionStrategy.eachDependency {
        if (requested.group == "org.jooq") {
            useVersion("3.17.3")
        }
    }
}

但这引入了需要Java 17的jOOQ开源版本,而我的项目仍使用Java 11,出现以下错误:

java.lang.UnsupportedClassVersionError: org/jooq/meta/jaxb/Configuration has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0

我认为无需升级Java 17,应该可以使用兼容Java 8的jOOQ trial版本。

参考相关社区Issue,我尝试添加模块替换配置:

dependencies {
    api("$jooqGroup:jooq:$jooqVersion")
    implementation("$jooqGroup:jooq-codegen:$jooqVersion")
    implementation("$jooqGroup:jooq-meta:$jooqVersion")
    jooqGenerator("org.postgresql:postgresql:42.4.2")
    runtimeOnly("org.postgresql:postgresql:42.4.2")

    modules {
        module("org.jooq:jooq") {
            replacedBy("$jooqGroup:jooq", "nu.studer.jooq bugfix #183")
        }
    }
}

但配置后无明显效果,问题依旧。


为便于复现问题,说明项目是包含jooq-codegen和server两个模块的Spring应用,以下是根项目和server模块的Gradle配置:

根项目build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "2.7.3"
    id("io.spring.dependency-management") version "1.0.13.RELEASE"
    kotlin("jvm") version "1.6.21"
    kotlin("plugin.spring") version "1.6.21"
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
}

springBoot {
    mainClass.value("my.app.server.JooqAuditLoggingApplication")
}

allprojects {
    repositories {
        mavenCentral()
        mavenLocal{
            content{
                includeGroup("org.jooq.trial-java-8")
            }
        }
    }
    group = "my.app"
    version = "0.0.1-SNAPSHOT"

    tasks.withType<JavaCompile>{
        options.encoding = "UTF-8"
    }
}

subprojects {
    apply(plugin ="io.spring.dependency-management")
    apply(plugin ="java-library")

    java.sourceCompatibility = JavaVersion.VERSION_11
    java.targetCompatibility = JavaVersion.VERSION_11
}

project("jooq-codegen"){
}

project("server"){
    apply(plugin = "org.jetbrains.kotlin.jvm")
    apply(plugin ="org.jetbrains.kotlin.plugin.spring")

    dependencies {
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    }

    tasks.withType<KotlinCompile> {
        kotlinOptions {
            freeCompilerArgs = listOf("-Xjsr305=strict")
            jvmTarget = "17"
        }
    }

    tasks.withType<Test> {
        useJUnitPlatform()
    }
}

server模块build.gradle.kts

import org.flywaydb.gradle.task.FlywayMigrateTask

plugins {
    id("org.springframework.boot") version "2.7.3"
    id("org.flywaydb.flyway") version "9.0.1"
}

dependencies {
    implementation(project(":jooq-codegen"))
    implementation("org.springframework.boot:spring-boot-starter-jooq"){
        exclude("org.jooq","jooq")
    }
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.security:spring-security-test")
    implementation("org.flywaydb:flyway-core")
}

flyway {
    url = "jdbc:postgresql://localhost:5432/mydemo"
    user = "foo"
    password = "bar"
    schemas = arrayOf("public")
    locations = arrayOf("classpath:db/migration")
    ignoreMigrationPatterns = arrayOf("*:missing")
    cleanDisabled = false
}
tasks.withType<FlywayMigrateTask>{
    dependsOn("processResources")
}

请问在不升级Java版本到17的前提下,如何正确配置jOOQ 3.17的审计列功能?有没有更简便的方法,不需要手动继承ForcedType类?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:18:27