如何在Gradle插件中配置jOOQ审计列?
我正在编写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

