2016-07-19 13 views
0

Ich habe ein Schema A.xsd, die B.xsd importiert und eines der komplexen Element <complex-element>. Nun habe ich die .episode Datei aus dem Kompilieren der B.xsd erstellt und als Eingabe A.xsd verwendet. Aber außer für die <complex-element> werden alle anderen untergeordneten Elementklassen erneut neu generiert.episode file für maven-jaxb22-plugin

A.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://example.com/a" xmlns="http://example.com/a" 
    xmlns:tns="http://example.com/b" elementFormDefault="qualified"> 

    <xs:import namespace="http://example.com/b" schemaLocation="b.xsd" /> 

    <xs:element name="root"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="element1" type="xs:string" minOccurs="0" /> 
       <!-- more elements --> 
       <xs:element name="elementx" type="xs:string" /> 
       <xs:element ref="tns:complex-element" minOccurs="0" /> 
      </xs:all> 
      <xs:attribute name="version" type="xs:string" /> 
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

B.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://example.com/b" xmlns="http://example.com/b" 
    elementFormDefault="qualified"> 

    <xs:element name="complex-element"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="list" type="list" minOccurs="0" 
        maxOccurs="1" /> 
       <xs:element name="code" type="code" minOccurs="0" 
        maxOccurs="1" /> 
       <xs:element name="message" type="xs:string" minOccurs="0" 
        maxOccurs="1" /> 
      </xs:all> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="list"> 
     <xs:sequence> 
      <xs:element name="file" type="file" minOccurs="1" 
       maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:simpleType name="code"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="S1" /> 
      <xs:enumeration value="S2" /> 
      <xs:enumeration value="S3" /> 
     </xs:restriction> 
    </xs:simpleType> 
<!-- more elements --> 
</xs:schema> 

pom.xml

<execution> 
    <id>aschema</id> 
    <phase>generate-sources</phase> 
    <goals> 
     <goal>generate</goal> 
    </goals> 
    <configuration> 
     <generateDirectory>src/main/java</generateDirectory> 
     <schemaIncludes> 
      <include>a.xsd</include> 
     </schemaIncludes> 
     <bindingIncludes> 
      <include>a.xjb</include> 
     </bindingIncludes> 
     <cleanPackageDirectories>false</cleanPackageDirectories> 
     <episode>false</episode> 
     <args> 
      <arg>-b</arg> 
      <arg>${basedir}/src/main/resources/b-episode</arg> 
      <arg>-Xinheritance</arg> 
      <arg>-Xxew</arg> 
      <arg>-Xannotate</arg> 
     </args> 
     <verbose>true</verbose> 
    </configuration> 
</execution>  

Nach der Ausführung der Klasse ComplexElement wird korrekt auf das vorhandene Paket referenziert, aber alle untergeordneten Elemente <list> und <code> generieren die Klasse unter dem Paket org.example.com.a, um stattdessen vorhandene Klassen innerhalb des org.example.com.b Pakets zu verweisen.

b-Folge

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" if-exists="true" 
    version="2.1"> 
    <bindings xmlns:tns="http://example.com/b" 
     if-exists="true" scd="x-schema::tns"> 
     <schemaBindings map="false"> 
      <package name="org.example.com.b" /> 
     </schemaBindings> 
     <bindings if-exists="true" scd="tns:complex-element"> 
      <class ref="org.example.com.b.ComplexElement" /> 
     </bindings> 
     <bindings if-exists="true" scd="~tns:list"> 
      <class ref="org.example.com.b.List" /> 
     </bindings> 
     <bindings if-exists="true" scd="~tns:file"> 
      <class ref="org.example.com.b.File" /> 
     </bindings> 
     <!-- and so on ... --> 
    </bindings> 

Antwort

1

Bitte beachten Sie die Dokumentation auf using episodes.

Kurz gesagt, statt der Verwendung der .episode Datei als Datei, die kompilierten Artefakt des Schemas A.xsd als episodes/episode in der Plugin-Konfiguration:

<dependencies> 
    ... 
    <dependency> 
     <groupId>com.acme.foo</groupId> 
     <artifactId>a-schema</artifactId> 
     <version>1.0</version> 
    </dependency> 
    ... 
</dependencies> 
<build> 
    <defaultGoal>test</defaultGoal> 
    <plugins> 
     <plugin> 
      <groupId>org.jvnet.jaxb2.maven2</groupId> 
      <artifactId>maven-jaxb2-plugin</artifactId> 
      <configuration> 
       <extension>true</extension> 
       <episodes> 
        <episode> 
         <groupId>com.acme.foo</groupId> 
         <artifactId>a-schema</artifactId> 
         <!-- Version is not required if the artifact is 
          configured as dependency --> 
        </episode> 
       </episodes> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

So sollten Sie nicht -b ${basedir}/src/main/resources/b-episode usw.

Haftungsausschluss: Ich bin der Autor von maven-jaxb2-plugin.

+0

Danke Ich habe den Link gesehen. Aber ich kann nicht, weil beide Schema Teil der gleichen pom.xml und in verschiedenen Ausführungsphasen sind. – ulab

+0

Warum kann es nicht so wie '-b $ {basedir}/src/main/resources/b-episode' funktionieren? Es ist flexibel, Episodendatei von der vorherigen Ausführung zu verwenden. Tatsächlich habe ich ' 'für eines der Projekte verwendet, die' xsd: simpletype 'haben und es hat funktioniert. Dieses Mal werden die untergeordneten Elemente vom Typ "xs: complex-type" neu generiert. – ulab

+1

@ulab Ich würde empfehlen, sie dann in verschiedenen Maven-Modulen zu trennen. Es kann mit '-b $ {basedir}/src/main/resources/b-episode' arbeiten, aber Sie verwenden besser' bindingDirectory' und 'bindingIncludes' anstelle von' -b'. Der Grund, dass es für Sie nicht funktioniert, ist wahrscheinlich, dass Sie '* .episode' Datei haben und' -b' zu einem Verzeichnis machen. XJC sucht dann nach **/*. Xjb'. Wenn Sie zumindest Conditionation-Elemente verwenden, können Sie 'mvn clean install -X' verwenden und das Protokoll überprüfen. Mit "-b" bist du alleine. – lexicore