2011-11-04 10 views
13

Sto provando a utilizzare la stessa classe generata ma in pacchetti separati. Così la struttura dovrebbe essere simile a questa:Creare una classe generata xsd comune da utilizzare con altri pacchetti

com.test.common 
    -commonType.java 
com.test.A 
    -objectA.java 
com.test.B 
    -objectB.java 

Ma continuo a ricevere questo:

com.test.common 
    -commonType.java 
com.test.A 
    -objectA.java 
    -commonType.java 
com.test.B 
    -objectB.java 
    -commonType.java 

mio Common.xsd si presenta così:

<?xml version="1.0"?> 
<xs:schema elementFormDefault="qualified" version="1.0" 
    targetNamespace="http://test.com/magic/common" 
    xmlns="http://test.com/magic/common" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="2.0"> 

    <xs:complexType name="CommonType"> 
     <xs:sequence> 
      <xs:element name="name" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

l'objectA.xsd assomiglia

<?xml version="1.0"?> 
<xs:schema elementFormDefault="qualified" version="1.0" 
    targetNamespace="http://test.com/magic/objectA" 
    xmlns:common="http://test.com/magic/common" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="2.0"> 

    <xs:complexType name="ObjectA"> 
     <xs:sequence> 
      <xs:element name="size" type="xs:string" /> 
      <xs:element name="commonA" type="common:CommonType" /> 
     </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

E obje ctB.xsd assomiglia:

<?xml version="1.0"?> 
<xs:schema elementFormDefault="qualified" version="1.0" 
    targetNamespace="http://test.com/magic/objectB" 
    xmlns:common="http://test.com/magic/common" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="2.0"> 

    <xs:complexType name="ObjectB"> 
     <xs:sequence> 
      <xs:element name="version" type="xs:string" /> 
      <xs:element name="commonB" type="common:CommonType" /> 
     </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

Ho un common.xjb file di legame comune che assomiglia a questo:

<jxb:bindings schemaLocation="../xsd/common.xsd" node="/xsd:schema"> 
     <jxb:schemaBindings> 
      <jxb:package name="com.test.common"/> 
     </jxb:schemaBindings> 
    </jxb:bindings> 

E infine il mio lavoro Maven si presenta così :

 <plugin> 
      <groupId>org.jvnet.jaxb2.maven2</groupId> 
      <artifactId>maven-jaxb2-plugin</artifactId> 
      <configuration> 
       <args> 
        <arg>-Xequals</arg> 
       </args> 
       <plugins> 
        <plugin> 
         <groupId>org.jvnet.jaxb2_commons</groupId> 
         <artifactId>jaxb2-basics</artifactId> 
         <version>0.6.3</version> 
        </plugin> 
       </plugins> 
       <episode>true</episode> 
       <extension>true</extension> 
       <verbose>true</verbose> 
       <generateDirectory>src/main/java</generateDirectory> 
      </configuration> 
      <executions> 
       <execution> 
        <id>common</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <generatePackage>com.test.common</generatePackage> 
         <schemaIncludes> 
          <includeSchema>xsd/common.xsd</includeSchema> 
         </schemaIncludes> 
        </configuration> 
       </execution> 
       <execution> 
        <id>login</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <generatePackage>com.test.A</generatePackage> 
         <bindingIncludes> 
          <includeBinding>xjb/commons.xjb</includeBinding> 
         </bindingIncludes> 
         <schemaIncludes> 
          <includeSchema>xsd/objectA.xsd</includeSchema> 
         </schemaIncludes> 
        </configuration> 
       </execution> 
       <execution> 
        <id>alert</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <generatePackage>com.test.B</generatePackage> 
         <bindingIncludes> 
          <includeBinding>xjb/commons.xjb</includeBinding> 
         </bindingIncludes> 
         <schemaIncludes> 
          <includeSchema>xsd/objectB.xsd</includeSchema> 
         </schemaIncludes> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 

risposta

11

c'è una parte nella documentazione maven-jaxb2-plugin dedicato specificamente al separate schema compilation. Ma puoi anche raggiungere il tuo obiettivo con i soliti binding XJC.

  • Non utilizzare generatePackage nella configurazione plug-in, utilizzare jaxb:package in attacchi, es .:

    <jaxb:schemaBindings> 
        <jaxb:package name="generatePackage"/> 
    </jaxb:schemaBindings> 
    
  • Usa <jaxb:class ref="com.test.common.CommonType"/> su commonType in xjb/commons.xjb.

SO Disclaimer: Sono l'autore dello maven-jaxb2-plugin.

8

È possibile utilizzare l'-episode estensione nella JAXB XJC per gestire questo caso d'uso:

XJC bando di Common.xsd

xjc -d out -episode common.episode common.xsd 

chiamata XJC per objectA.xsd

L'episodio il file prodotto dal primo passaggio è in realtà un file di binding esterno JAXB che contiene collegamenti tra tipi di schemi e classi esistenti. Ciò impedisce a XJC di rigenerare queste classi.

xjc -d out objectA.xsd -extension -b common.episode 

Per un esempio dettagliato

+0

Ho provato a utilizzarlo ma continuo a generare CommonType in entrambe le volte – Matt

+0

Ho dovuto aggiungere lo schema XML necessario Importa ' 'ma una volta fatto ho potuto usare la riga di comando XJC come descritto nella mia risposta per generare solo le classi da common.xsd una volta. –

+0

è corretto, la riga di comando funziona come previsto ma per qualche motivo il plugin Maven non funziona anche quando si specificano le configurazioni Matt

Problemi correlati