Мы пытались сгенерировать классы JAXB с использованием классов gradle, xsd и xjc, а классы JAXB должны иметь аннотации XmlRootElement, чтобы их можно было использовать для отображения как ответ веб-службы. Мы следили за этой ссылкой http://azagorneanu.blogspot.com/2011/09/configure-maven-to-generate-classes.html, это помогло во многом, но мы не смогли найти один конкретный пример только с градием. Поэтому мы выяснили несколько вещей, которые мы поделимся в качестве ответа.Как сгенерировать классы jaxb из xsd с помощью классов gradle, jaxb и xjc, классы должны иметь XmlRootElement
ответ
build.gradle должен выглядеть ниже
buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath "net.saliman:gradle-cobertura-plugin:2.2.4"
classpath 'com.github.jacobono:gradle-jaxb-plugin:1.3.5'
}
}
apply plugin: 'com.github.jacobono.jaxb'
dependencies {
jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.7'
jaxb "org.jvnet.jaxb2_commons:jaxb2-basics-ant:0.6.5"
jaxb "org.jvnet.jaxb2_commons:jaxb2-basics:0.6.4"
jaxb "org.jvnet.jaxb2_commons:jaxb2-basics-annotate:0.6.4"
}
configurations {
jaxb
}
task jaxb(){
description 'Converts xsds to classes'
def jaxbTargetDir = file("generated")
doLast {
jaxbTargetDir.mkdirs()
ant.taskdef(name: 'xjc', classname: 'org.jvnet.jaxb2_commons.xjc.XJC2Task', classpath: configurations.jaxb.asPath)
ant.jaxbTargetDir = jaxbTargetDir
ant.xjc(destdir: '${jaxbTargetDir}', package: 'com.sample.jaxbclasses', schema:'generated/schema.xsd', binding:'generated/binding.xjb', extension:'true'){
arg(value: "-Xannotate")
}
}
}
schema.xsd
<xs:element name="user" type="user" />
<xs:element name="userList" type="userList" />
<xs:complexType name="user">
<xs:all>
<xs:element name="id" type="xs:long" minOccurs="0" />
<xs:element name="name" type="xs:string" />
<xs:element name="registrationDate" type="xs:dateTime" />
</xs:all>
</xs:complexType>
<xs:complexType name="userList">
<xs:sequence>
<xs:element name="user" type="user" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:schema>
binding.xjb
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/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"
version="2.1">
<jaxb:globalBindings>
<!-- Use java.util.Calendar instead of javax.xml.datatype.XMLGregorianCalendar for xs:dateTime -->
<jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
<!-- Force all classes implements Serializable -->
<xjc:serializable uid="1" />
</jaxb:globalBindings>
<!-- Annotate the following classes with XmlRootElement -->
<jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
<jaxb:bindings node="xs:complexType[@name='user']">
<annox:annotate>
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="user" />
</annox:annotate>
</jaxb:bindings>
<jaxb:bindings node="xs:complexType[@name='userList']">
<annox:annotate>
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="userList" />
</annox:annotate>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
ниже binding.xjb может быть используется также
<?xml version="1.0"?>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
<jxb:globalBindings>
<xjc:simple />
</jxb:globalBindings>
</jxb:bindings>
</jxb:bindings>
Теперь вы можете запустить задачу 'JAXB', Все готово. Cheers!
User.java
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2017.01.26 at 11:59:18 AM EST
//
package com.sample.jaxbclasses;
import java.io.Serializable;
import java.util.Calendar;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
/**
* <p>Java class for user complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="user">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <all>
* <element name="id" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="registrationDate" type="{http://www.w3.org/2001/XMLSchema}dateTime"/>
* </all>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {
})
@XmlRootElement(name = "user")
public class User
implements Serializable
{
private final static long serialVersionUID = 1L;
protected Long id;
@XmlElement(required = true)
protected String name;
@XmlElement(required = true, type = String.class)
@XmlJavaTypeAdapter(Adapter1 .class)
@XmlSchemaType(name = "dateTime")
protected Calendar registrationDate;
/**
* Gets the value of the id property.
*
* @return
* possible object is
* {@link Long }
*
*/
public Long getId() {
return id;
}
/**
* Sets the value of the id property.
*
* @param value
* allowed object is
* {@link Long }
*
*/
public void setId(Long value) {
this.id = value;
}
/**
* Gets the value of the name property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getName() {
return name;
}
/**
* Sets the value of the name property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setName(String value) {
this.name = value;
}
/**
* Gets the value of the registrationDate property.
*
* @return
* possible object is
* {@link String }
*
*/
public Calendar getRegistrationDate() {
return registrationDate;
}
/**
* Sets the value of the registrationDate property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setRegistrationDate(Calendar value) {
this.registrationDate = value;
}
}
group 'com.example'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenCentral()
}
project.ext {
jaxbTargetDir = file("src/generated/java")
}
configurations {
xsd2java
}
dependencies {
xsd2java "com.sun.xml.bind:jaxb-xjc:2.2.6"
xsd2java "com.sun.xml.bind:jaxb-impl:2.2.6"
}
task xsd2java() {
doLast {
jaxbTargetDir.mkdirs()
ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: configurations.xsd2java.asPath)
ant.jaxbTargetDir = jaxbTargetDir
ant.xjc(
destdir: '${jaxbTargetDir}',
package: 'com.example.request',
schema: 'src/main/resources/XMLreq.xsd'
)
ant.xjc(
destdir: '${jaxbTargetDir}',
package: 'com.example.response',
schema: 'src/main/resources/XMLres.xsd'
)
}
}
compileJava.dependsOn xsd2java
Моя версия использование Gradle родной функция для генерации jaxbclasses.
При необходимости, если ваша схема зависит от внешних xsd (s), используйте метод «Каталог Oasis» для локального локального локального локального XSD. Также в этом случае отключите проверки схемы XML, чтобы предотвратить ошибки проверки.
При необходимости вы можете настроить свои jaxbclasses с помощью специального привязки jaxb. (Jaxb-bindings.xjb)
В основном это настраиваемая задача градиента, которая вызывает задачу муравья XJCTask, доступную в Java VM, в моих примерах библиотеки из 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>
Для jaxbinding
<?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, вы необходимо включить эти классы для сборки. Вам нужно настроить макет источника градиента и зависимости.
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
}
Вот и все!
jeejava.com/generating-jaxb-classes-from-xsd-using-gradle/ – user3470953