2009-12-17 13 views
9

Tôi đang sử dụng JAXB để tạo ra lớp đối tượng java từ schemas xml trong một kịch bản Ant như vậy:Tôi có thể xử lý nhiều xsd shemas bằng cách sử dụng jaxb và tác vụ Ant xjc như thế nào?

<!-- JAXB compiler task definition --> 
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask" 
        classpathref="master-classpath"/> 

<!-- Generates the source code from the ff.xsd schema using jaxb --> 
<target name="option-generate" description="Generates the source code"> 
    <mkdir dir="${generated-src.dir}/${option.dir}"/> 
    <xjc schema="${config.dir}/ff.xsd" destdir="${generated-src.dir}" 
     package="${option.package.name}"> 
     <arg value="-Xcommons-lang" /> 
     <arg value="-Xcommons-lang:ToStringStyle=SHORT_PREFIX_STYLE" /> 
     <produces dir="${generated-src.dir}" includes="**/*.java" /> 
    </xjc> 
</target> 

Bây giờ, công trình này rực rỡ cho một schema (ff.xsd trong ví dụ này). Làm cách nào để xử lý một số lược đồ (nghĩa là một số tệp xsd)?

Tôi đã thử một nhiệm vụ kiến ​​riêng cho mỗi lược đồ, nhưng bằng cách nào đó, điều này không hoạt động khi Ant xử lý tác vụ đầu tiên và sau đó nói rằng "tệp được cập nhật" cho các lược đồ sau đây!

Bất kỳ ý tưởng nào?

Trả lời

11
<target name="process-resources" description="Process resources"> 
    <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask"/> 
    <xjc destdir="${basedir}/target/generated-sources/jaxb" 
     extension="true"> 
     <schema dir="src/main/xsd" 
       includes="JaxbBindings.xsd,CoreTypes.xsd"/> 
    </xjc> 
</target> 
+0

ah vĩ đại, chính xác những gì tôi needed.Thanks! – dm76

3
<target name="generate-jaxb-code"> 
    <java classname="com.sun.tools.internal.xjc.XJCFacade"> 
      <arg value="-p" /> 
      <arg value="com.example"/> 
      <arg value="xsd/sample.xsd" /> 
    </java> 
</target> 

công trình với JAXB là một phần của JDK 6 dường như nhiệm vụ ANT chỉ tàu với JAXB tải nhưng vì JAXB là một phần của JDK lẽ không phải là một ý tưởng tốt đẹp của nó để có những phiên bản mới nhất của JAXB và thêm vào classpath của JDK vì điều đó có nghĩa là bạn có thể cần phải lộn xộn xung quanh với các thiết lập của trình nạp lớp, để lấy phiên bản đã tải xuống thay vì phiên bản trong JDK.

0

Bạn cũng có thể chỉ bao gồm các tập tin XSD khác trong tập tin XSD chính của bạn, bằng cách sử dụng lệnh như sau:

<xs:include schemaLocation="path/to/secondschema.xsd"/> 
+0

Làm thế nào để biên dịch nhiều xsds với mục tiêu Ant này? –

+0

@VinitGaikwad Tôi nghĩ rằng tôi đã nói rằng bạn trỏ kiến ​​đến 'xsd' chính của bạn, nhưng tệp' xsd' chính có thể có lồng nhau bao gồm các chỉ thị cho các tệp 'xsd' khác. Điều này sẽ khiến JAXB xử lý tất cả các tệp 'xsd' lồng nhau, mặc dù cấp cao nhất của mã của bạn chỉ trỏ đến một cấp cao nhất' xsd'. Nhưng tôi đã không làm điều này trong một thời gian, vì vậy bạn sẽ phải kiểm tra các chi tiết. – CodeMed