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>
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
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
@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