मैं कई स्कीमा पैकेज बनाने के लिए jaxb / Maven को कैसे बता सकता हूं?


80

उदाहरण:

</plugin>       
       <plugin>
           <groupId>org.jvnet.jaxb2.maven2</groupId>
           <artifactId>maven-jaxb2-plugin</artifactId>
           <version>0.7.1</version>
           <executions>
             <execution>
               <goals>
                 <goal>generate</goal>
               </goals>
             </execution>
           </executions>
            <configuration>
             <schemaDirectory>src/main/resources/dir1</schemaDirectory>
              <schemaIncludes>
                  <include>schema1.xsd</include>
              </schemaIncludes>
              <generatePackage>schema1.package</generatePackage>
           </configuration>
         </plugin>
          <plugin>
           <groupId>org.jvnet.jaxb2.maven2</groupId>
           <artifactId>maven-jaxb2-plugin</artifactId>
           <version>0.7.1</version>
           <executions>
             <execution>
               <goals>
                 <goal>generate</goal>
               </goals>
             </execution>
           </executions>
            <configuration>
             <schemaDirectory>src/main/resources/dir2</schemaDirectory>
              <schemaIncludes>
                  <include>schema2.xsd</include>
              </schemaIncludes>
              <generatePackage>schema2.package</generatePackage>
           </configuration>
         </plugin>
       </plugins>

क्या हुआ: मावेन ने पहला प्लगइन निष्पादित किया। फिर लक्ष्य फ़ोल्डर को हटाता है और दूसरा पैकेज बनाता है, जो तब दिखाई देता है।

मैंने पहले कॉन्फ़िगरेशन के लिए लक्ष्य / somedir1 और दूसरे कॉन्फ़िगरेशन के लिए लक्ष्य / somedir2 सेट करने का प्रयास किया। लेकिन व्यवहार नहीं बदलता है? कोई विचार? मैं सीधे src / main / java फोल्डर में पैकेज जेनरेट नहीं करना चाहता, क्योंकि ये पैकेज जेनरेट किए गए हैं और इन्हें मैनुअल निर्मित क्लासेस के साथ नहीं मिलाना चाहिए।


हाँ, यहाँ एक ही मुद्दा मिला, हालांकि पास्कल का समाधान एकदम सही है। अब मुझे केवल यह चाहिए कि जनरेट कोड के साथ अच्छा खेलने के लिए IDE प्राप्त करना है, अन्यथा मुझे वही चाहिए जो मुझे चाहिए था।
न्यूटोपियन

जवाबों:


119

मुझे अलग-अलग निर्दिष्ट करना पड़ा generateDirectory(इसके बिना, प्लगइन विचार कर रहा था कि फाइलें अद्यतित थीं और दूसरे निष्पादन के दौरान कुछ भी उत्पन्न नहीं कर रही थीं)। और मैं target/generated-sources/<tool>उत्पन्न स्रोतों के लिए सम्मेलन का पालन करने की सलाह देता हूं ताकि वे आपके पसंदीदा आईडीई में स्वचालित रूप से आयात हो जाएं। मैं executionप्लगइन को दो बार घोषित करने के बजाय (और configurationप्रत्येक executionतत्व को अंदर ले जाने के लिए ) घोषित करने की सलाह देता हूं :

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.7.1</version>
  <executions>
    <execution>
      <id>schema1-generate</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>src/main/resources/dir1</schemaDirectory>
        <schemaIncludes>
          <include>shiporder.xsd</include>
        </schemaIncludes>
        <generatePackage>com.stackoverflow.package1</generatePackage>
        <generateDirectory>${project.build.directory}/generated-sources/xjc1</generateDirectory>
      </configuration>
    </execution>
    <execution>
      <id>schema2-generate</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>src/main/resources/dir2</schemaDirectory>
        <schemaIncludes>
          <include>books.xsd</include>
        </schemaIncludes>
        <generatePackage>com.stackoverflow.package2</generatePackage>
        <generateDirectory>${project.build.directory}/generated-sources/xjc2</generateDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

इस सेटअप के साथ, मैं एक के बाद निम्नलिखित परिणाम प्राप्त करता हूं mvn clean compile

$ वृक्ष लक्ष्य /
लक्ष्य /
├── कक्षाएं
├── ├──। Com
स्टैकओवरफ़्लो └── └── └──
├── ├── │ App.class
। │ │ package1
│ cl │ ├── ObjectFactory.class
│ ass │ ├── शिप्रोड.क्लास
Item। │ ├── शिपयार्ड $ Item.class
│ to │ └── शिपयार्ड $ शिप्टो.क्लास
पैकेज 2
├──। │ BookForm.class
├──। │ BooksForm.class
├──। │ ObjectFactory.class
└──। │ पैकेज- info.class
Ir ir dir1
└──। │ जहाज चलाने वाला। Xsd
Ir ir dir2
।। किताबें। Xsd
Sources उत्पन्न-स्रोत
    C xjc
    │ └── META-INF
    --सूरज- jaxb.episode
    1 xjc1
    └── └──। Com
    Over over स्टैकओवरफ्लो
    1 1 पैकेज 1
    F F ObjectFactory.java
    Order order शिप्रा.जावा
    2 xjc2
        └── com
            Flow स्टैकओवरफ़्लो
                └── पैकेज 2
                    । BookForm.java
                    । BooksForm.java
                    । ObjectFactory.java
                    Fo पैकेज-info.java

जो अपेक्षित परिणाम प्रतीत हो रहा है।


धन्यवाद, मुझे वास्तव में कल भी यही समस्या थी लेकिन पल-पल इस पर विचार किया। आपका समाधान लगभग पूरी तरह से काम करता है, मेरा एकमात्र मुद्दा अब यह है कि मुझे बिना त्रुटि के संकलन करने के लिए ग्रहण नहीं मिल सकता है। हालांकि कमांड लाइन पर सब अच्छा है। मेरा वर्तमान वर्कअराउंड यह है कि मैं इन फ़ोल्डरों को स्रोत फ़ोल्डर के रूप में लक्ष्य घोषित करता हूं और यह सब अच्छा है .. हालांकि मुझे यकीन नहीं है कि मुझे यह बहुत पसंद है, मैं उत्पन्न कोड के साथ एक जार
बनाऊंगा

1
ग्रहण प्लगइन m2eclipse बिल्ड पथ को अद्यतन करता है। Mvc क्लीन असेंबली के साथ बीन्स उत्पन्न करने के बाद: असेंबली मैं सिर्फ [प्रोजेक्ट पर राइट क्लिक करें]> [मावेन]> [प्रोजेक्ट कॉन्फ़िगरेशन को अपडेट करें] और यह बिल्ड पथ को अपडेट करता है।
एमआर

@Newtopian @ @ की टिप्पणी देखें, यदि आप मेरे द्वारा बताए गए अधिवेशन का अनुसरण करते हैं, तो m2eclipse आपके लिए ऐसा करेगा।
पास्कल थिवेंट

हम्म ठीक है, वही काम करता है जो मैंने स्वयं किया था, अब केवल एक या दो क्लिक लगते हैं। स्रोत फ़ोल्डर्स में लक्ष्य को देखने के लिए अभी भी अजीब है, लेकिन अब ऐसा करना लगभग मुफ्त है इसलिए मैं इसे
रखूंगा

1
मुझे पता है कि यह पुराना सवाल है लेकिन मुझे उम्मीद है कि कुछ मुझे जवाब देंगे। मैं उस कोड का उपयोग करता हूं और यह काम करता है। लेकिन जब मैं एक ही पैकेज सेट करना चाहता हूं तो यह हमेशा केवल एक स्कीमा उत्पन्न करता है। पहले निष्पादन में उदाहरण के लिए मैंने com.myproject.answer और दूसरे निष्पादन com.myproject.request में सेट किया है .. और स्रोत उत्पन्न करने के बाद मेरे पास केवल * उत्तर पैकेज और अनुरोध गायब है ... किसी भी विचार को कैसे ठीक किया जाए? निर्देशिका उत्पन्न मैं भी एक ही सेट करें।
डेनिस स्टेफानोव

14

आप प्रत्येक स्कीमा के लिए अलग पैकेज निर्दिष्ट करने के लिए JAXB बाइंडिंग का भी उपयोग कर सकते हैं, जैसे

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0" schemaLocation="book.xsd">

    <jaxb:globalBindings>
        <xjc:serializable uid="1" />
    </jaxb:globalBindings>

    <jaxb:schemaBindings>
        <jaxb:package name="com.stackoverflow.book" />
    </jaxb:schemaBindings>

</jaxb:bindings>

तो बस नए maven-jaxb2- प्लगइन 0.8.0 <schemas>और <bindings>तत्वों का उपयोग करें pom.xml। या अपने स्कीमा और बाइंडिंग द्वारा <schemaDirectory>और सबसे शीर्ष निर्देशिका निर्दिष्ट करें :<bindingDirectory><include>

<schemaDirectory>src/main/resources/xsd</schemaDirectory>
<schemaIncludes>
    <include>book/*.xsd</include>
    <include>person/*.xsd</include>
</schemaIncludes>
<bindingDirectory>src/main/resources</bindingDirectory>
<bindingIncludes>
    <include>book/*.xjb</include>
    <include>person/*.xjb</include>
</bindingIncludes>

मुझे लगता है कि यह अधिक सुविधाजनक समाधान है , क्योंकि जब आप pom.xmlएक नया एक्सएसडी जोड़ते हैं तो आपको मावेन को बदलने की आवश्यकता नहीं होती है , बस उसी निर्देशिका में एक नई एक्सजेबी बाइंडिंग फ़ाइल जोड़ें।


एक वाक्यविन्यास हाइलाइट संकेत प्रदान करने के लिए संपादित करते समय पोस्ट की विरासत में सुधार होता है
केव

ठीक है, स्पष्टीकरण के लिए धन्यवाद। मुझे यह नहीं मिला है कि एडिट किया गया सिंटैक्स हाइलाइटिंग है।
xmedeko

2
यह मेरे लिए सबसे अच्छा जवाब है क्योंकि मैं हर बार एक नया स्कीमा जोड़ने के लिए पॉम को बदलना नहीं चाहूंगा।
बेन थर्ले

यहाँ एक मुद्दा यह है कि अगर पुस्तक और व्यक्ति xsd में समान लक्ष्य नाम स्थान पर हैं। मान लीजिए कि इसके बजाय उनके पास पुस्तक, पत्रिका, समाचार पत्र आदि हैं, जिनमें सभी publishable.xsd शामिल हैं। उन्हें publishable के रूप में एक ही नामस्थान में होना चाहिए, और इस प्रकार एक दूसरे को, और अब यह टूट जाता है क्योंकि आप केवल नाम के अनुसार एक स्कीमाबाइंडिंग कर सकते हैं। मैं मानता हूं कि यह आदर्श है, और मेरी इच्छा है कि यह ऊपर के उदाहरण के लिए काम करे, लेकिन JAXB अभी पर्याप्त लचीला नहीं है।
शलजमप्रांती

8

आपको यह बदलना चाहिए कि प्लगइन को केवल एक बार परिभाषित करना है और दो बार निष्पादन क्षेत्रों को करना है ... निम्न की तरह ... और उत्पन्नडायरेरी सेट की जानी चाहिए (डॉक्स पर आधारित) ।।

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.7.1</version>
  <executions>
    <execution>
      <id>firstrun</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generateDirectory>target/gen1</generateDirectory>
        <schemaDirectory>src/main/resources/dir1</schemaDirectory>
        <schemaIncludes>
          <include>schema1.xsd</include>
        </schemaIncludes>
        <generatePackage>schema1.package</generatePackage>
      </configuration>
    </execution>
    <execution>
      <id>secondrun</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generateDirectory>target/gen2</generateDirectory>
        <schemaDirectory>src/main/resources/dir2</schemaDirectory>
        <schemaIncludes>
          <include>schema2.xsd</include>
        </schemaIncludes>
        <generatePackage>schema2.package</generatePackage>
      </configuration>
    </execution>
  </executions>
</plugin>

मुझे ऐसा लगा कि आप मावेन की एकल कलाकारी के खिलाफ लड़ रहे हैं ... हो सकता है कि आपको इस बारे में सोचना चाहिए।


मॉड्यूल नियम प्रति एक विरूपण साक्ष्य सच है लेकिन ... ओपी दो कलाकृतियों को उत्पन्न नहीं कर रहा है।
पास्कल थिवेंट

5

यह स्कीमा के लिए बासी फ़ाइल नाम निर्दिष्ट करके और आउटपुट निर्देशिका को साफ़ नहीं करके भी प्राप्त किया जा सकता है। डिफ़ॉल्ट आउट पुट निर्देशिका स्वचालित रूप से क्लासपाथ में शामिल है जो थोड़ा सुविधाजनक है। यदि हम अलग-अलग आउटपुट डायरेक्टरी निर्दिष्ट करते हैं, तो IDE में इस कोड का उपयोग करने के लिए क्लासपैथ का ध्यान रखना होगा। उदाहरण के लिए -

<plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.3.1</version>
            <configuration>
                <quiet>true</quiet>
                <verbose>false</verbose>
                <clearOutputDir>false</clearOutputDir>
                <readOnly>true</readOnly>
                <arguments>-mark-generated</arguments>
            </configuration>
            <executions>
                <execution>
                    <id>reportingSchema</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <schemaDirectory>src/main/resources/schema/r17/schemaReporting</schemaDirectory>
                        <schemaIncludes>
                            <include>OCISchemaReporting.xsd</include>
                        </schemaIncludes>
                        <packageName>com.broadsoft.oci.r17.reporting</packageName>
                        <staleFile>${build.directory}/generated-sources/.jaxb-staleFlag-reporting</staleFile>
                    </configuration>
                </execution>
                <execution>
                    <id>schemaAS</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <schemaDirectory>src/main/resources/schema/r17/schemaAS</schemaDirectory>
                        <schemaIncludes>
                            <include>OCISchemaAS.xsd</include>
                        </schemaIncludes>
                        <packageName>com.broadsoft.oci.r17.as</packageName>
                        <staleFile>${build.directory}/generated-sources/.jaxb-staleFlag-as</staleFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
</plugins>

स्रोत: JAXB प्लगइन के साथ कोड जनरेट करना


5

मैंने इसके साथ हल किया है:

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                        <forceRegenerate>true</forceRegenerate>

इसे प्रत्येक कॉन्फ़िगरेशन में जोड़ें;)


2
आप इसे केवल <executions>टैग में भी जोड़ सकते हैं । यह पर्याप्त है। <removeOldOutput>डिफ़ॉल्ट रूप से गलत पर सेट है। लेकिन मैं static.highsource.org/mjiip/maven-jaxb2-plugin/…<clearOutputDir>

मेरे लिए असली समाधान, कारण आप हर फ़ोल्डर में एक ही फ़ोल्डर उत्पन्न कर सकते हैं
MilacH

<clearOutputDir>false</clearOutputDir>मेरे मामले में मेरे लिए काफी था।
रूवांका मधुशन

3

यह प्लगइन के संस्करण 1.6 में तय किया गया है

            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>

त्वरित नोट हालांकि, मैंने देखा कि पहला पुनरावृत्ति आउटपुट हटा दिया जा रहा था। मैंने इसे प्रत्येक निष्पादन में निम्नलिखित जोड़कर तय किया।

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>

यहां प्रत्येक पुनरावृत्ति आउटपुट के साथ मेरा पूरा काम करने का उदाहरण है। BTW मुझे ऐसा करना पड़ा क्योंकि xsd के I के साथ डुप्लिकेट नेमस्पेस समस्या के कारण मुझे दिया गया था। यह मेरी समस्या को हल करने के लिए लगता है।

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <id>submitOrderRequest</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <schemaDirectory>src/main/resources/xsd/</schemaDirectory>
                        <!-- <schemaFiles>getOrderStatusResponse.xsd,quoteShippingRequest.xsd,quoteShippingResponse.xsd,submitOrderRequest.xsd,submitOrderResponse.xsd</schemaFiles> -->
                        <schemaFiles>submitOrderRequest.xsd</schemaFiles>
                        <bindingDirectory>${project.basedir}/src/main/resources/xjb</bindingDirectory>
                        <bindingFiles>submitOrderRequest.xjb</bindingFiles>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                </execution>
                <execution>
                    <id>submitOrderResponse</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <schemaDirectory>src/main/resources/xsd/</schemaDirectory>
                        <!-- <schemaFiles>getOrderStatusResponse.xsd,quoteShippingRequest.xsd,quoteShippingResponse.xsd,submitOrderRequest.xsd,submitOrderResponse.xsd</schemaFiles> -->
                        <schemaFiles>submitOrderResponse.xsd</schemaFiles>
                        <bindingDirectory>${project.basedir}/src/main/resources/xjb</bindingDirectory>
                        <bindingFiles>submitOrderResponse.xjb</bindingFiles>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                </execution>
            </executions>

        </plugin>

2

बहुत परीक्षण के बाद, मेरे लिए निम्नलिखित काम करता है

<plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>jaxb2-maven-plugin</artifactId>
         <version>2.1</version>
         <executions>
            <execution>
              <id>xjc1</id>
              <goals>
                  <goal>xjc</goal>
              </goals>
             <configuration>
                <packageName>com.mycompany.clientSummary</packageName>
               <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetClientSummary.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                 <clearOutputDir>false</clearOutputDir>
            </configuration>
          </execution>

          <execution>
             <id>xjc2</id>
             <goals>
                 <goal>xjc</goal>
             </goals>
             <configuration>
                <packageName>com.mycompany.wsclient.employerProfile</packageName>
                <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetEmployerProfile.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
         </configuration>
         </execution>

         <execution>
            <id>xjc3</id>
            <goals>
                <goal>xjc</goal>
            </goals>
            <configuration>
                <packageName>com.mycompany.wsclient.producersLicenseData</packageName>
                <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetProducersLicenseData.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
            </configuration>
        </execution>


     </executions>
  </plugin>

2

मावेन में जक्सब का उपयोग करते समय मुझे बहुत सारी समस्याओं का सामना करना पड़ा लेकिन मैंने निम्नलिखित काम करके आपकी समस्या को हल किया

सबसे पहले एक schema.xjc फ़ाइल बनाएँ

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               jaxb:version="2.0">
    <jaxb:bindings schemaLocation="YOUR_URL?wsdl#types?schema1">
        <jaxb:schemaBindings>
            <jaxb:package name="your.package.name.schema1"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>
    <jaxb:bindings schemaLocation="YOUR_URL??wsdl#types?schema2">
        <jaxb:schemaBindings>
            <jaxb:package name="your.package.name.schema2"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>
</jaxb:bindings>

पैकेज का नाम कुछ भी हो सकता है आप इसे तब तक चाहते हैं, जब तक कि इसमें जावा में कोई आरक्षित कीवर्ड न हों

आगे आपको अपने स्थान पर अपना पसंदीदा और कोड जनरेट करने के लिए wsimport.bat स्क्रिप्ट बनानी होगी।

cd C:\YOUR\PATH\TO\PLACE\THE\PACKAGES
wsimport -keep -verbose -b "C:\YOUR\PATH\TO\schema.xjb" YOUR_URL?wsdl
pause

यदि आप cd का उपयोग नहीं करना चाहते हैं, तो आप wsimport.bat को "C: \ your \ PATH \ TO \ PLACE \ THE \ PACKAGES" में रख सकते हैं

यदि आप इसे बिना -ver -verb के चलाते हैं तो यह केवल संकुल को उत्पन्न करेगा, लेकिन .java फ़ाइलों को नहीं।

-B बनाते समय स्कीमा.xjc का उपयोग सुनिश्चित करता है


0

इसका एक और स्पष्ट, एक (IMO) समाधान है "staleFile" नामक एक पैरामीटर है जो फिर से सामान उत्पन्न करने के लिए ध्वज के रूप में उपयोग करता है। बस इसे प्रत्येक निष्पादन में बदल दें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.