java - Jooq "generateJooq"在 Spring Boot 应用程序中导致 java.lang.ClassNotFoundException : jakarta. xml.bind.annotation.XmlSchema

标签 java spring spring-boot jooq

我正在使用 Gradle 7.3.3 构建一个 Spring Boot 应用程序,该应用程序使用 jooq 从预先存在的数据库模式生成表、POJO 和记录类。当尝试将 jooqVersion 从 3.15.5 升级到 3.16.0 时,:generateJooq 返回以下错误:

> Task :generateJooq FAILED
1 actionable task: 1 executed
Exception in thread "main" java.lang.NoClassDefFoundError: jakarta/xml/bind/annotation/XmlSchema
    at org.jooq.util.jaxb.tools.MiniJAXB.getNamespace(MiniJAXB.java:400)
    at org.jooq.util.jaxb.tools.MiniJAXB.addDefaultNamespace(MiniJAXB.java:188)
    at org.jooq.util.jaxb.tools.MiniJAXB.unmarshal0(MiniJAXB.java:175)
    at org.jooq.util.jaxb.tools.MiniJAXB.unmarshal(MiniJAXB.java:161)
    at org.jooq.codegen.GenerationTool.load(GenerationTool.java:1180)
    at org.jooq.codegen.GenerationTool.main(GenerationTool.java:203)
Caused by: java.lang.ClassNotFoundException: jakarta.xml.bind.annotation.XmlSchema
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 6 more


Caused by: java.lang.ClassNotFoundException: jakarta.xml.bind.annotation.XmlSchema

:generateJooq 在 3.15.5 中运行良好。我们需要 3.16.0,因为它(据说)允许 DSL 操作 PostGIS 查询。

许多帖子都建议这样做,但在本例中不起作用。

implementation 'jakarta.xml.bind:jakarta.xml.bind-api:3.0.1'
implementation 'org.glassfish.jaxb:jaxb-runtime:3.0.1'

我目前使用 Azul Zulu 版本 15.0.5 (JDK 15) 和 Gradle 的 Jooq 插件:

import nu.studer.gradle.jooq.JooqEdition

plugins {
    id 'java'
    id 'jacoco'
    id 'maven-publish'
    id 'org.springframework.boot' version '2.3.1.RELEASE'
    id 'com.github.johnrengelman.shadow' version '5.2.0'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'com.jfrog.artifactory' version '4.16.0'
    id 'nu.studer.jooq' version '6.0.1'
}

我的依赖项如下:

ext {
    assertjVersion = '3.22.0'
    awsSdkVersion = '1.11.812'
    awsLambdaEventsVersion = '2.2.9' //version 3.1.0 does not deserialize S3Event properly
    awsLambdaCoreVersion = '1.2.1'
    geojsonJacksonVersion = '1.14'
    lombokVersion = '1.18.22'
    mapstructVersion = '1.4.2.Final'
    postgresVersion = '42.3.1'
    slf4jVersion = '1.7.32'
    springCloudFunctionVersion = '3.0.6.RELEASE'
    springCloudVersion = '2.2.6.RELEASE'
    testNGVersion = '7.4.0'
    msDbSchemaVersion = '0.10.10'
    jooqVersion = '3.16.0'
}

dependencies {
    implementation("org.mapstruct:mapstruct:${mapstructVersion}")
    annotationProcessor("org.mapstruct:mapstruct-processor:${mapstructVersion}")
    annotationProcessor("org.projectlombok:lombok:${lombokVersion}")
    compileOnly("org.projectlombok:lombok:${lombokVersion}")
    implementation("org.springframework.cloud:spring-cloud-function-context")
    implementation("org.springframework.cloud:spring-cloud-starter-function-web")
    implementation("org.slf4j:slf4j-api:${slf4jVersion}")
    implementation("de.grundid.opendatalab:geojson-jackson:${geojsonJacksonVersion}")
    implementation 'jakarta.xml.bind:jakarta.xml.bind-api:3.0.1'
    implementation 'org.glassfish.jaxb:jaxb-runtime:3.0.1'

    implementation 'org.liquibase:liquibase-core'
    implementation("org.jooq:jooq:${jooqVersion}")

    jooqGenerator("org.postgresql:postgresql:${postgresVersion}")

    implementation('org.springframework.boot:spring-boot-starter-jooq')
    implementation("org.postgresql:postgresql:${postgresVersion}")

    implementation("com.amazonaws:aws-lambda-java-events:${awsLambdaEventsVersion}")
    implementation("com.amazonaws:aws-lambda-java-core:${awsLambdaCoreVersion}")
    implementation("com.amazonaws:aws-java-sdk-s3:${awsSdkVersion}")

    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    testImplementation("org.testng:testng:${testNGVersion}")
    testImplementation("org.assertj:assertj-core:${assertjVersion}")
}

更新:使用依赖关系洞察显示 jakarta.xml.bind:jakarta.xml.bind-api 被强制降至 2.3.3,但没有任何内容(据我所知)提供执行此操作的规则。

$ ./gradlew --scan -q dependencyInsight --configuration jooqGenerator --dependency jakarta.xml.bind-api 
jakarta.xml.bind:jakarta.xml.bind-api:2.3.3 (selected by rule)
   variant "runtime" [
      org.gradle.status          = release (not requested)
      org.gradle.usage           = java-runtime (not requested)
      org.gradle.libraryelements = jar (not requested)
      org.gradle.category        = library (not requested)
   ]

jakarta.xml.bind:jakarta.xml.bind-api:3.0.0 -> 2.3.3
\--- org.jooq:jooq:3.16.3
     +--- org.jooq:jooq-codegen:3.16.3
     |    \--- jooqGenerator (requested org.jooq:jooq-codegen)
     \--- org.jooq:jooq-meta:3.16.3
          \--- org.jooq:jooq-codegen:3.16.3 (*)

(*) - dependencies omitted (listed previously)

最佳答案

io.spring.dependency-management 置于构建隔离中可以解决使用 nu.studer.jooq 插件 7.0 版时的问题:

plugins {
    id 'java'
    id 'jacoco'
    id 'maven-publish'
    id 'org.springframework.boot' version '2.6.3'
    id 'com.github.johnrengelman.shadow' version '5.2.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE' apply false
    id 'com.jfrog.artifactory' version '4.16.0'
    id 'nu.studer.jooq' version '7.0'
}

然后:

build {

    apply plugin: 'io.spring.dependency-management'

    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-function-dependencies:${springCloudFunctionVersion}"
        }
    }

}

这是因为 io.spring.dependency-management 强制(按照规则)使用 jakarta.xml.bind:jakarta.xml.bind-api 3.0 版本。 0 降至 2.3.3。

关于java - Jooq "generateJooq"在 Spring Boot 应用程序中导致 java.lang.ClassNotFoundException : jakarta. xml.bind.annotation.XmlSchema,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70947495/

相关文章:

java - 安卓 : How to use same AlarmManager in loop?

java - 使用 NTLM 连接到 LDAP (Active Directory)

java - 使用 Gradle 和转义字符自动扩展属性

java - 如何将 HashMap 的键和值设置为 xml 文件的标签和值

java - Enum.valueOf 对扩展 Enum 的类的未知类型发出警告?

java - 将请求从 spring controller 重新发送到 spring controller

spring - 将 spring.jackson.serialization.write-dates-as-timestamps 和 date-format 全局设置为 ISO 1806

Spring Boot 允许在请求参数中使用方括号嵌套对象

java - Spring - 从 xml 到 Java 配置

java - RequestMapping 在 spring 中是如何工作的