Gradle с плагином wsdl2java

Я использую плагин no.nils.wsdl2java, полный файл gradle.build выглядит так:

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.12.RELEASE'
    id 'java'
    id "no.nils.wsdl2java" version "0.10"
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    jaxb
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation group: 'com.oracle.ojdbc', name: 'orai18n', version: '19.3.0.0'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'com.google.code.gson:gson:2.8.5'
}

tasks.named('test') {
    useJUnitPlatform()
}
wsdl2java {
    generatedWsdlDir = file("build/generated/wsdl/Service")
    wsdlsToGenerate = [
            ['-p', 'Service', '-wsdlLocation', 'classpath:wsdl/Service.wsdl',
             '-autoNameResolution', "src/main/resources/wsdl/Service.wsdl"]
    ]
}

Когда я создаю проект с помощью gradle jvm версии 11, получаю исключение:

Не удалось загрузить класс «jakarta.xml.bind.JAXBException».

** Но в версии 8 возникает ошибка:

org/apache/cxf/tools/wsdlto/WSDLToJava был скомпилирован более новой версией среды выполнения Java (версия файла класса 55.0), эта версия среды выполнения Java распознает только версии файла класса до 52.0.

Я знаю о миграции пространства имен javax -> jakarta, но как решить мою проблему?

Отвечает ли это на ваш вопрос? Класс был скомпилирован более новой версией Java Environment

aSemy 27.12.2022 15:26

Spring Boot 2.3.4 ожидает классы из пакета javax.xml.bind. Либо обновитесь до Spring Boot 3.0 (который ожидает их от jakarta.xml.bind), либо убедитесь, что вы используете версию wsdl2java, которая генерирует классы с классами из пакета javax.xml.bind.

Mark Rotteveel 27.12.2022 16:45

Ничего из вышеперечисленного не сработало, пытался работать с java 19, но проблема та же, исключение: невозможно загрузить класс «jakarta.xml.bind.JAXBException». Не могу перейти на Spring Boot 3.0, потому что для этого требуется как минимум Java 17, мне нужна Java 8.

LordCommander 28.12.2022 10:55

Вы решили это? Я столкнулся с точно такой же проблемой и не имею возможности обновить java до более новой версии, чем 8.

kojot 29.12.2022 13:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
414
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем build.gradle добавьте это:

wsdl2javaExt {
    cxfVersion = "3.5.5"
}

чтобы явно указать версию Apache CXF. Он должен правильно компилироваться с Java 8.


Ну, ошибка говорит, что org/apache/cxf/tools/wsdlto/WSDLToJava скомпилирован с Java 11, но ваш проект использует Java 8. Этот класс загружается плагином wsdl2java:

 def wsdlToJava = classLoader.loadClass("org.apache.cxf.tools.wsdlto.WSDLToJava").newInstance()

и это часть проекта Apache CXF. Чтобы увидеть, откуда он взялся, вы можете распечатать дерево зависимостей:

./gradlew app:dependencies --configuration wsdl2java

в результате вы можете найти:

+--- org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:+ -> 4.0.0
...
|    +--- org.apache.cxf:cxf-tools-wsdlto-core:4.0.0

версия org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb установлена ​​​​на +, поэтому gradle использует самую новую версию, и на данный момент это 4.0.0. Плагин добавляет эти зависимости в эти строки:

            // add cxf as dependency
            project.dependencies {
                wsdl2java "org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:$cxfVersion"

$cxfVersion по умолчанию установлено значение +, но вы можете переопределить его в build.gradle с помощью следующего кода:

wsdl2javaExt {
    cxfVersion = "3.5.5"
}

использовать предыдущую версию Apache CXF (совместимую с Java 8)

Другие вопросы по теме