将 XSD 升级到 Java 翻译,从 Java 8/JAXB 到 Java 17/Jakarta

问题描述 投票:0回答:1

我正在努力更新现有的 Java 8 和 JAXB Gradle 构建,该构建生成从 XSD 到 Java 17 和 Jakarta 的 Java 对象。如何更新以下 Gradle 任务以使用 Jakarta?有XJC雅加达任务吗?我似乎找不到参考资料。

这是我的build.gradle:

plugins {
    id 'java'
}

defaultTasks 'clean', 'compileJava'

project.ext {
    jaxbTargetDir = "xsd_src"
    schemaSrc = "xsd_v1.0"
    schemaName = "schema_20180419.xsd"
}

sourceSets {
    main {
        // use ant generated src and extra source
        java { 
            srcDir "${jaxbTargetDir}"
            srcDir 'extra_src'
        }
        // include the src in the jar
        resources {
            srcDir "${schemaSrc}"
        }
    }
}

tasks.withType(JavaCompile).configureEach {
    options.fork = true  // Fork your compilation into a child process
    options.forkOptions.setMemoryMaximumSize("4g") // Set maximum memory to 4g
}

configurations {
    xsd2Java
}

dependencies {      
    // Java EE Dependencies
    xsd2Java('jakarta.xml.bind:jakarta.xml.bind-api:4.0.0')
    xsd2Java('jakarta.activation:jakarta.activation-api:2.0.0')
    xsd2Java('jakarta.annotation:jakarta.annotation-api:2.1.0-B1')
    
    implementation 'org.javassist:javassist:3.29.0-GA'
    
    // Versioning comes from Maven Jaxb2 Plugin   
    implementation 'org.jvnet.jaxb:jaxb2-basics:2.0.5'
    implementation 'org.jvnet.jaxb:jaxb2-basics-ant:2.0.5'
    implementation 'org.jvnet.jaxb:jaxb-basics-annotate:2.0.5'
    implementation 'org.jvnet.jaxb:jaxb2-basics-runtime:2.0.5'
                
    implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.1'
    implementation 'org.glassfish.jaxb:jaxb-xjc:4.0.0-M4'
    
    compileOnly 'org.slf4j:slf4j-simple:1.7.28'
}

task xsd2Java() {
    doLast {          
        ant.taskdef(name: 'xjc', classname: 'org.jvnet.jaxb2_commons.xjc.XJC2Task', classpath: configurations.compileClasspath.asPath)
        ant.jaxbTargetDir = file("${jaxbTargetDir}")

        ant.xjc(
            extension: true,
            destdir: '${jaxbTargetDir}',
            binding: file("${schemaSrc}/bindingsv.xjb"),
            
        ) {
            schema(dir: "${schemaSrc}") {
                include(name: "${schemaName}")
            }
            arg(line: "-nv -extension -xmlschema -Xannotate -XtoString -Xequals -XhashCode -Xcopyable")
            // check the timestamps on xsds and java files to see if we need to regenerate
            depends(dir: "${schemaSrc}") {
                include(name: "**/*.xsd")
            }
            produces(dir: "${jaxbTargetDir}") {
                include(name: "**/*.java")
            }
        }
    }
}

compileJava.dependsOn 'xsd2Java'

我还更新了 bindingsv.xjb 以引用雅加达:

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings
    xmlns:jxb="https://jakarta.ee/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="https://jakarta.ee/xml/ns/jaxb/xjc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:annox="http://annox.dev.java.net"
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd 
                    http://annox.dev.java.net"
    jxb:extensionBindingPrefixes="annox xjc" version="3.0">

但是,当我运行构建时,我收到此错误:

Execution failed for task ':Services:messages:xsd2Java'.
> java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

如何解决这个错误?

java gradle jaxb build.gradle jakarta-migration
1个回答
2
投票

我不知道这是否能完全解决你的问题,但你正在使用 jaxb2-basics v2 和 jakarta build,这是不受支持的。

您应该迁移到 v4 版本(目前最新的是 4.0.8)。请参阅迁移指南,了解如何从 v2 迁移到 v3(然后从 v3 迁移到 v4)此处

    // Versioning comes from Maven Jaxb2 Plugin, replaced by v4 equivalent in same order
    implementation 'org.jvnet.jaxb:jaxb-plugins:4.0.8'
    implementation 'org.jvnet.jaxb:jaxb-plugins-ant:4.0.8'
    implementation 'org.jvnet.jaxb:jaxb-plugin-annotate:4.0.8'
    implementation 'org.jvnet.jaxb:jaxb-plugins-runtime:4.0.8'
© www.soinside.com 2019 - 2024. All rights reserved.