2011-11-04 37 views
13

我試圖使用相同的生成的類,但在單獨的包中。因此,結構應該是這個樣子:創建一個通用的xsd生成的類,以供其他包使用

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

但我不斷收到這樣的:

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

我common.xsd看起來是這樣的:

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

的objectA.xsd樣子

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

and obje ctB.xsd樣子:

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

我有一個共同的綁定文件common.xjb它看起來像這樣:

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

最後我Maven的工作看起來是這樣的:

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

回答

11

還有就是maven-jaxb2-plugin文檔特別地專用於在separate schema compilation一部分。但是你也可以用通常的XJC綁定實現你的目標。

  • 不要xjb/commons.xjb在插件配置使用generatePackage,在綁定使用jaxb:package,例:

    <jaxb:schemaBindings> 
        <jaxb:package name="generatePackage"/> 
    </jaxb:schemaBindings> 
    
  • 使用<jaxb:class ref="com.test.common.CommonType"/>commonType

SO聲明:我是maven-jaxb2-plugin的作者。

8

您可以使用-episode擴展在JAXB XJC來處理這個用例:

XJC呼籲common.xsd

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

XJC呼籲objectA.xsd

情節從第一步生成的文件實際上是一個JAXB外部綁定文件,其中包含模式類型和現有類之間的鏈接。這可以防止XJC重新生成這些類。

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

有關詳細示例

+0

我嘗試過使用它,但我仍然導致CommonType生成兩次 – Matt

+0

我不得不添加必要的XML模式導入''但是一旦我做了,我就可以像我的答案中所描述的那樣使用命令行XJC,只從common.xsd生成一次類。 –

+0

這是正確的命令行按預期工作,但由於某種原因,即使當我指定 配置maven插件不工作 – Matt

相關問題