基于Kotlin/Gradle/Spring/JOOQ应用报错及版本冲突排查求助
问题:jOOQ代码生成任务
generateJooq报错 运行:generateJooq任务时触发如下错误:
> Task :generateJooq 12:01:46 WARNING org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 127; cvc-elt.1.a: Cannot find the declaration of element 'configuration'. Exception in thread "main" java.lang.NoSuchMethodError: 'java.lang.String org.jooq.meta.jaxb.Generator.getJava()' at org.jooq.codegen.GenerationTool.run0(GenerationTool.java:396) at org.jooq.codegen.GenerationTool.run(GenerationTool.java:246) at org.jooq.codegen.GenerationTool.generate(GenerationTool.java:241) at org.jooq.codegen.GenerationTool.main(GenerationTool.java:213)
当前build.gradle.kts配置如下:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jooq.meta.jaxb.ForcedType import org.jooq.meta.jaxb.Logging import org.jooq.meta.jaxb.Property plugins { id("org.springframework.boot") version "3.2.2" id("io.spring.dependency-management") version "1.1.4" kotlin("jvm") version "1.9.22" kotlin("plugin.spring") version "1.9.22" id("nu.studer.jooq") version "9.0" } group = "com.example" version = "0.0.1-SNAPSHOT" java { sourceCompatibility = JavaVersion.VERSION_17 } configurations { compileOnly { extendsFrom(configurations.annotationProcessor.get()) } } repositories { mavenCentral() } dependencies { implementation("org.springframework.boot:spring-boot-starter-jooq") implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") compileOnly("org.projectlombok:lombok") runtimeOnly("org.postgresql:postgresql") annotationProcessor("org.projectlombok:lombok") testImplementation("org.springframework.boot:spring-boot-starter-test") implementation("org.jooq:jooq:3.19.1") implementation("org.jooq:jooq-meta:3.19.1") implementation("org.jooq:jooq-codegen:3.19.1") jooqGenerator("org.postgresql:postgresql:42.5.4") } tasks.withType<KotlinCompile> { kotlinOptions { freeCompilerArgs += "-Xjsr305=strict" jvmTarget = "17" } } tasks.withType<Test> { useJUnitPlatform() } jooq { version.set("3.19.1") edition.set(nu.studer.gradle.jooq.JooqEdition.OSS) configurations { create("main") { generateSchemaSourceOnCompilation.set(true) jooqConfiguration.apply { logging = Logging.WARN jdbc.apply { driver = "org.postgresql.Driver" url = "jdbc:postgresql://localhost:5432/mydb" user = "postgres" password = "postgres" properties.add(Property().apply { key = "ssl" value = "false" }) } 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" } )) } generate.apply { isDeprecated = false isRecords = true isImmutablePojos = true isFluentSetters = true } target.apply { packageName = "com.example.Server" directory = "build/generated-src/jooq/main" } strategy.name = "org.jooq.codegen.DefaultGeneratorStrategy" } } } } } buildscript { configurations["classpath"].resolutionStrategy.eachDependency { if (requested.group.startsWith("org.jooq") && requested.name.startsWith("jooq")) { useVersion("3.19.1") } } }
已确认PostgreSQL数据库可正常登录,推测为JOOQ各库版本冲突,需调试解决。
调试与解决步骤
1. 移除冗余的jOOQ依赖
spring-boot-starter-jooq已经包含了jooq、jooq-meta、jooq-codegen的核心依赖,无需单独声明implementation。删除dependencies块中以下三行:
implementation("org.jooq:jooq:3.19.1") implementation("org.jooq:jooq-meta:3.19.1") implementation("org.jooq:jooq-codegen:3.19.1")
2. 统一JOOQ版本与Spring Boot的兼容性
Spring Boot 3.2.2默认依赖的JOOQ版本是3.18.8,你指定的3.19.1版本与Spring Boot的依赖版本不匹配,会导致类方法签名不一致(如报错中的Generator.getJava()方法不存在)。解决方式二选一:
- 方式一:改用Spring Boot管理的JOOQ版本,删除
jooq块中的version.set("3.19.1"),让插件自动继承Spring Boot的版本 - 方式二:强制Spring Boot使用3.19.1版本,在
dependencyManagement块中添加:
dependencyManagement { imports { mavenBom("org.springframework.boot:spring-boot-dependencies:3.2.2") } dependencies { dependency("org.jooq:jooq:3.19.1") dependency("org.jooq:jooq-meta:3.19.1") dependency("org.jooq:jooq-codegen:3.19.1") } }
3. 检查依赖树确认版本一致性
运行以下Gradle命令查看JOOQ相关依赖的版本,确认没有多版本共存:
./gradlew dependencies --configuration implementation ./gradlew dependencies --configuration jooqGenerator
输出中如果发现不同版本的JOOQ依赖,说明存在冲突,需要通过resolutionStrategy强制统一。
4. 简化buildscript中的版本强制逻辑
nu.studer.jooq插件已经提供了版本管理能力,可删除buildscript块中的版本强制代码,避免重复配置。
5. 重新执行代码生成任务
清理之前的构建缓存,重新运行任务:
./gradlew clean generateJooq
内容的提问来源于stack exchange,提问作者guest348342083049
相关产品推荐
相关产品推荐

