2011-11-04 10 views
13

Estoy tratando de usar la misma clase generada pero en paquetes separados. Por lo que la estructura debe ser algo como esto:Crear una clase común xsd generada para ser utilizada por otros paquetes

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

pero aparece esto:

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

Mi common.xsd se ve así:

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

la objectA.xsd parece

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

Y obje ctB.xsd parece:

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

Tengo un archivo common.xjb de unión común que se parece a esto:

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

Y finalmente mi trabajo experto tiene este aspecto :

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

Respuesta

11

hay una parte en la documentación maven-jaxb2-plugin dedicada específicamente a la separate schema compilation. Pero también puedes lograr tu objetivo con los enlaces XJC habituales.

  • No utilice generatePackage en la configuración del plug-in, utilice jaxb:package en encuadernaciones, ej .:

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

SO Descargo de responsabilidad: soy el autor del maven-jaxb2-plugin.

8

Puede utilizar la extensión -episode en el JAXB XJC para manejar este caso de uso:

XJC llamado a common.xsd

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

llamada XJC para objectA.xsd

El episodio El archivo producido desde el primer paso es realmente un archivo de enlaces externos JAXB que contiene enlaces entre tipos de esquema y clases existentes. Esto evita que XJC regenere estas clases.

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

Para un ejemplo detallado

+0

Traté de usar eso, pero todavía me da como resultado que CommonType se genere ambas veces – Matt

+0

Tuve que agregar las importaciones de esquema XML necesarias ' 'pero una vez que lo hice, pude usar la línea de comando XJC como se describe en mi respuesta para generar solo las clases de common.xsd una vez. –

+0

eso es correcto, la línea de comandos funciona como se esperaba, pero por alguna razón el complemento maven no funciona incluso cuando especifico configuraciones – Matt

Cuestiones relacionadas