2011-11-04 29 views
13

Tôi đang cố gắng sử dụng cùng một lớp được tạo nhưng trong các gói riêng biệt. Vì vậy, cấu trúc nên tìm một cái gì đó như thế này:Tạo một lớp được tạo xsd chung để các gói khác sử dụng

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

Nhưng tôi cứ bị này:

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

common.xsd của tôi trông như thế này:

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

các objectA.xsd trông giống như

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

Và obje ctB.xsd trông giống như:

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

Tôi có một tập tin common.xjb ràng buộc chung mà trông như thế này:

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

Và cuối cùng công việc maven của tôi trông như thế này :

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

Trả lời

11

Có một phần trong tài liệu maven-jaxb2-plugin dành riêng đặc biệt để các separate schema compilation. Nhưng bạn cũng có thể đạt được mục tiêu của mình với các ràng buộc XJC thông thường.

  • Không sử dụng generatePackage trong cấu hình plugin, sử dụng jaxb:package trong ràng buộc, cựu .:

    <jaxb:schemaBindings> 
        <jaxb:package name="generatePackage"/> 
    </jaxb:schemaBindings> 
    
  • Sử dụng <jaxb:class ref="com.test.common.CommonType"/> trên commonType trong xjb/commons.xjb.

SO Tuyên bố từ chối trách nhiệm: Tôi là tác giả của maven-jaxb2-plugin.

8

Bạn có thể sử dụng phần mở rộng -episode trong JAXB XJC để xử lý trường hợp sử dụng này:

XJC gọi cho common.xsd

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

gọi XJC cho objectA.xsd

Tập tệp được tạo ra từ bước đầu tiên thực sự là một tệp kết buộc bên ngoài JAXB chứa các liên kết giữa các loại lược đồ và các lớp hiện có. Điều này ngăn XJC tái tạo các lớp này.

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

Đối với một ví dụ chi tiết

+0

Tôi đã thử sử dụng điều đó nhưng tôi vẫn cho kết quả CommonType được tạo ra cả hai lần – Matt

+0

Tôi phải thêm lược đồ XML cần thiết nhập khẩu ' 'nhưng một khi tôi đã làm tôi đã có thể sử dụng dòng lệnh XJC như mô tả trong câu trả lời của tôi để chỉ tạo ra các lớp từ common.xsd một lần. –

+0

đúng là dòng lệnh hoạt động như mong đợi nhưng vì một số lý do plugin maven không hoạt động ngay cả khi tôi chỉ định cấu hình – Matt

Các vấn đề liên quan