2012-02-29 24 views
5

Tôi đang sử dụng plugin javenb2 maven để tạo các lớp Java, được xây dựng từ các lược đồ trong một cái bình. Tuy nhiên, tôi không chắc chắn làm thế nào để định vị chính xác các lược đồ này từ một tệp kết buộc. Nếu Iextract các lược đồ từ các jar và thả chúng trong cùng một thư mục như các ràng buộc, tất cả là tốt. Tuy nhiên, đây không phải là một giải pháp thực tế lâu dài.Ràng buộc JAXB đối với các lược đồ trong một JAR

pom.xml:

<plugin> 
<groupId>org.jvnet.jaxb2.maven2</groupId> 
    <artifactId>maven-jaxb2-plugin</artifactId> 
    <version>0.8.1</version> 
    <executions> 
    <execution> 
    <goals> 
     <goal>generate</goal> 
    </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <schemas> 
    <schema> 
     <dependencyResource> 
     <groupId>com.test</groupId> 
     <artifactId>schemas</artifactId> 
     <version>1.10-SNAPSHOT</version> 
     <resource>schemas/schema.xsd</resource> 
     </dependencyResource> 
    </schema> 
    </schemas>    
    <bindingDirectory>bindings</bindingDirectory> 
    <generatePackage>test.package</generatePackage> 
    <bindingIncludes> 
    <include>*.xml</include> 
    </bindingIncludes> 
    <extension>true</extension> 
    </configuration> 
    </plugin> 

bindings.xml:

<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb ./bindingschema_2_1.xsd" 
version="2.1"> 

<jxb:bindings schemaLocation="classpath:/schemas/schema.xsd" node="/xs:schema"> 
    <jxb:bindings node="//xs:complexType[@name='AbstractChangeable']"> 
    <jxb:class implClass="com.test.AbstractEntity" /> 
    </jxb:bindings> 
</jxb:bindings> 

Trả lời

5

Những gì tôi muốn đã làm việc ở đây là cái gì đó như:

<jaxb:bindings schemaLocation="maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-po!/purchaseorder.xsd" node="/xs:schema"> 
    <jaxb:schemaBindings> 
     <jaxb:package name="org.jvnet.jaxb2.maven2.tests.po"/> 
    </jaxb:schemaBindings>  
</jaxb:bindings> 

Nhưng nó không vào lúc này. Vui lòng file an issue, tôi sẽ cố gắng khắc phục.

gì làm việc bây giờ là SCD dựa trên ràng buộc:

<jaxb:bindings scd="x-schema::po" xmlns:po="urn:po"> 
    <jaxb:schemaBindings> 
     <jaxb:package name="org.jvnet.jaxb2.maven2.tests.po"/> 
    </jaxb:schemaBindings>  
</jaxb:bindings> 

Vì vậy, bạn không thực sự cần để ràng buộc dựa trên một vị trí sơ đồ cụ thể, bạn có thể ràng buộc dựa trên namespace URI, đó là trên lý thuyết tốt hơn .

Thực tế tôi có trải nghiệm rằng các kết buộc SCD không phải lúc nào cũng hoạt động đáng tin cậy.

CẬP NHẬT

Xem this link để biết thêm thông tin SCD sử dụng trong JAXB.

+0

Tôi không thực sự chắc chắn làm thế nào để sử dụng kỹ thuật ràng buộc SCB này để tham khảo các lược đồ bên trong một bình chứa phụ thuộc được cung cấp, có các ví dụ không? – user1234057

+0

Tôi đã đăng ví dụ ở trên. Bạn phải chỉ rõ tiền tố không gian tên ('xmlns: po =" urn: po "') và sử dụng tiền tố này trong biểu thức scd ('scd =" x-schema :: po "' có nghĩa là "địa chỉ lược đồ với không gian tên đích từ tiền tố 'po'"). Xem liên kết này: http://jaxb.java.net/guide/Using_SCD_for_customizations.html – lexicore

+0

Chúng tôi đã không thực sự hiểu cách tham chiếu một bình maven với phương thức đó, nhưng chúng tôi sẽ chờ cho đến khi plugin được cập nhật. Cảm ơn đã giúp đỡ! – user1234057

6

Bạn cần phải sử dụng maven-dependency-plugin:unpack và sau đó trỏ maven-jaxb2-plugin-outputDirectory. Trong trường hợp này trong tập tin ràng buộc bạn cần phải nói điều gì đó như schemaLocation="../target/schemas/schema.xsd"

+1

Tôi đã nhận loại giải pháp đó hoạt động như đã đề cập, nhưng tôi muốn biết cách tham khảo lược đồ bên trong một cái bình. – user1234057

-2

Tôi biết đây là một câu hỏi cũ nhưng tôi đã đấu tranh với cùng một vấn đề. Tôi thấy rằng làm các ràng buộc nội tuyến sẽ giải quyết được vấn đề. Bạn sẽ không còn cần bất kỳ tập tin ràng buộc nào và các ràng buộc sẽ được chuyển sang các dự án tùy thuộc vào nó.

+0

Câu trả lời của bạn sẽ tốt hơn nhiều với một ví dụ về mã. – gknicker

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