我的版本使用 gradle 原生特性来生成 jaxbclasses。
(可选)如果您的架构依赖于外部 xsd,请使用“Oasis 目录”技术在本地解析外部 XSD。同样在这种情况下禁用 XML 模式验证以防止验证错误。
您可以选择使用自定义 jaxb 绑定来调整您的 jaxbclasses。 (Jaxb-bindings.xjb)
基本上是一个 gradle 自定义任务,它调用 Java VM 中可用的 XJCTask ant 任务,在我的示例库中来自 Java 8。任务名称是“generateSources”,需要根据您的架构位置进行调整。
configurations {
jaxb // Only for generation purpose
}
dependencies {
jaxb 'javax.xml.bind:jaxb-api:2.2.11'
jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.11'
jaxb 'com.sun.xml.bind:jaxb-impl:2.2.11'
jaxb 'com.sun.xml.bind:jaxb-osgi:2.2.11'
}
task generateSources() {
doLast {
def jaxbTargetDir = file("$buildDir/generated/src/main/java")
if (!jaxbTargetDir.exists()) {
jaxbTargetDir.mkdirs()
}
ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: configurations.jaxb.asPath)
ant.xjc(
destdir: "${jaxbTargetDir}",
schema: "${projectDir}/src/main/resources/MySchema.xsd",
binding: "${projectDir}/src/main/resources/jaxb-bindings.xjb",
catalog: "${projectDir}/src/main/resources/catalog.xml",
removeOldOutput: 'yes', extension: 'true'
)
{
arg(line: '-nv -disableXmlSecurity')
}
}
}
如果您需要目录,请创建一个可能如下所示的文件“catalog.xml”:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE catalog
PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system systemId="http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/xenc-schema.xsd" uri="xenc-schema.xsd" />
<system systemId="http://www.w3.org/TR/xmlenc-core/xenc-schema.xsd" uri="xenc-schema.xsd" />
<system systemId="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd" uri="xmldsig-core-schema.xsd" />
</catalog>
对于 jax 绑定
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.1"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<globalBindings>
<xjc:javaType
adapter="org.gazpachoquest.sample.JodaLocalDateTimeConverter"
name="org.joda.time.LocalDateTime" xmlType="xs:dateTime" />
</globalBindings>
</bindings>
如果除了 jaxb 生成之外,还需要包含那些类来构建。您需要调整 gradle 源布局和依赖项。
apply plugin: 'java'
def generatedSourcesOutput = "$buildDir/generated/main/java"
sourceSets {
main {
java.srcDirs "$generatedSourcesOutput"
}
}
configurations {
jaxb
}
dependencies {
jaxb 'javax.xml.bind:jaxb-api:2.2.11'
jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.11'
jaxb 'com.sun.xml.bind:jaxb-impl:2.2.11'
jaxb 'com.sun.xml.bind:jaxb-osgi:2.2.11'
compile 'com.sun.xml.bind:jaxb-xjc:2.2.11'
compile 'com.sun.xml.bind:jaxb-impl:2.2.11'
compile 'javax.xml.bind:jaxb-api:2.2.11'
}
compileJava {
dependsOn generateSources
}
就是这样!