2012-01-12 11 views
5

Tôi đang sử dụngLàm thế nào để tùy chỉnh package-info.java tạo ra bởi JAXB2

<groupId>org.jvnet.jaxb2.maven2</groupId> 
<artifactId>maven-jaxb2-plugin</artifactId> 

để tạo ra các lớp Java từ các tập tin XSD.

Tôi đã thêm

<args>-npa</args> 

như vậy, các plugin không tạo nữa package-info.java, nhưng với tùy chọn này các lớp java tạo ra là khác nhau (không gian tên được thêm vào mỗi phần tử).

Vì vậy, tôi không thể tùy chỉnh không gian tên bằng cách sử dụng package-info.java.

Tôi làm cách nào để sử dụng không gian tên tùy chỉnh mà không sửa đổi tệp được tạo theo cách thủ công?

Trả lời

6

Bạn có thể sử dụng namespace-prefix plugin từ dự án jaxb2-chung (từ chối trách nhiệm: Tôi đã viết nó):

https://github.com/Siggen/jaxb2-namespace-prefix

Đây là một pluging XJC cho phép để xác định không gian tên -> ánh xạ prefix trong bindings.xml file:

<jxb:bindings schemaLocation="eCH-0007-3-0.xsd"> 
    <jxb:schemaBindings> 
     <jxb:package name="ch.ech.ech0007.v3" /> 
    </jxb:schemaBindings> 
    <jxb:bindings> 
     <namespace:prefix name="eCH-0007" /> 
    </jxb:bindings> 
</jxb:bindings> 

Mà sẽ resul ts trong package-info.java tập tin sau đây được tạo ra (tâm xmlns thêm chú thích):

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.ech.ch/xmlns/eCH-0007/3", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns = { 
    @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.ech.ch/xmlns/eCH-0007/3", prefix = "eCH-0007-3") 
}) 
package ch.ech.ech0007.v3; 

bạn pom.xml sẽ trông như thế:

<plugin> 
    <groupId>org.jvnet.jaxb2.maven2</groupId> 
    <artifactId>maven-jaxb2-plugin</artifactId> 
    <version>0.8.0</version> 
    <configuration> 
     <schemaDirectory>src/main/resources</schemaDirectory> 
     <catalog>src/main/resources/catalog.xml</catalog> 
     <schemaIncludes> 
      <include>*.xsd</include> 
     </schemaIncludes> 
     <bindingDirectory>src/main/resources</bindingDirectory> 
     <bindingIncludes> 
      <include>bindings.xml</include> 
     </bindingIncludes> 
     <args> 
      <arg>-extension</arg> 
      <arg>-Xnamespace-prefix</arg> 
     </args> 
    </configuration> 
    <executions> 
     <execution> 
      <goals> 
       <goal>generate</goal> 
      </goals> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
      <groupId>org.jvnet.jaxb2_commons</groupId> 
      <artifactId>jaxb2-namespace-prefix</artifactId> 
      <version>1.0-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 
</plugin> 
+0

Nếu tôi muốn ghi đè lên '@ javax.xml.bind.annotation.XmlSchema (namespace =" http://www.ech.ch/xmlns/eCH-0007/3 "' to '@javax .xml.bind.annotation.XmlSchema (namespace = "" '? Làm thế nào có thể được thực hiện? – icedek

+0

Hoàn hảo, cảm ơn bạn! –

+0

@icedek, nếu bạn thay đổi không gian tên xml, bạn đang thay đổi định nghĩa của XSD của bạn: mặc dù Cấu trúc xml sẽ vẫn giống nhau, chúng sẽ không tương thích, nếu bạn cần làm điều đó, tại sao không sửa đổi chính XSD? – Siggen

2

Bạn có thể tùy chỉnh không gian tên bằng cách hướng dẫn JAX-B để tạo ra các package-info.java và đặt không gian tên đích cần thiết trong XSD của bạn.

<xs:schema version="1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd" 
    targetNamespace="yourTargetNameSpace" 
    xmlns="yourTargetNameSpace" 
    elementFormDefault="qualified"> 
+0

Đây là câu trả lời dễ nhất nếu bạn có quyền truy cập vào xsd. – Dave