2011-07-13 18 views
20

मेरे पास दर्जनों और दर्जनों .xsd फ़ाइलें हैं जिन्हें मैं कोड को स्वतः उत्पन्न करना चाहता हूं। कुछ फाइलों में डुप्लिकेट नाम होते हैं जो एक ही समय में उन सभी को उत्पन्न करने का प्रयास करते समय संघर्ष करते हैं।क्या JAXB में एकाधिक .xsd फ़ाइलों में डुप्लिकेट तत्व परिभाषाओं से निपटने का कोई तरीका है?

मैं इन कामों में से 2 को पाने के लिए बस ध्यान केंद्रित कर रहा हूं।

जब मुझे इन 2 काम मिलते हैं तो मैं बाकी को ठीक कर दूंगा। लेकिन मैं अभी इन फ़ाइलों में से 2 पर ध्यान केंद्रित कर रहा हूं। मैं उनके नियंत्रण में नहीं हूं, वे एक विक्रेता से हैं और "मानक" का पालन करें, इसलिए उन्हें संपादित करने से कई कारणों से विकल्प नहीं है।

मैं इन फ़ाइलों को संसाधित करने के लिए maven-jaxb2-plugin का उपयोग कर रहा हूं।

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

<?xml version="1.0" encoding="UTF-8"?> 
<jxb:bindings version="2.1" 
       xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" 
       xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
       xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xsi:schemaLocation=" http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"> 
    <jxb:bindings schemaLocation="mac-3.4.xsd"> 
    <jxb:schemaBindings> 
     <jxb:package name="my.company.mac"/> 
    </jxb:schemaBindings> 
    </jxb:bindings> 
    <jxb:bindings schemaLocation="mac-stylesheet-3.4.xsd"> 
    <jxb:schemaBindings> 
     <jxb:package name="my.company.stylesheet"/> 
    </jxb:schemaBindings> 
    </jxb:bindings> 
</jxb:bindings> 

निम्न त्रुटि देता है

[ERROR] Error while parsing schema(s).Location [ file:/C:/Users/Jarrod%20Roberson/Projects/spa-tools/spa-lib/src/main/sc 
hema/mac-stylesheet-3.4.xsd{165,33}]. 
org.xml.sax.SAXParseException: 'halign' is already defined 

अपमानजनक तत्व है:

<xsd:simpleType name="halign"> 
    <xsd:restriction base="xsd:string"> 
    <xsd:enumeration value="left" /> 
    <xsd:enumeration value="center" /> 
    <xsd:enumeration value="right" /> 
    </xsd:restriction> 
</xsd:simpleType> 

(वहाँ कई अन्य हैं यह सिर्फ पहले एक है कि संघर्ष है) और में से प्रत्येक में समान होता है .xsd फाइलें, मैं इस डुप्लिकेशंस को केवल एक वर्ग उत्पन्न करने के साथ कैसे हल करूं या प्रत्येक को अपने पैकेज नामस्थान में जेनरेट किया जा रहा है?

यह एकमात्र डुप्लिकेट तत्व नहीं है जैसे कि उनमें से बहुत सारे हैं, इसलिए बस उन्हें फ़ाइलों से निकालने का प्रयास करना एक विकल्प नहीं है।

यह halign कई .xsd फाइलों में है और मैं या तो उन्हें अपनी व्यक्तिगत संकुल में डाल दिया, या पहले एक उत्पन्न हुए उस का उपयोग करने के संकलक बताने के लिए सक्षम होना चाहते हैं।

यह वह जगह है जहां मैंने बाहरी .xjb फ़ाइल को को में निर्दिष्ट करके शुरू किया था।

डुप्लिकेट कॉन्फ़िगरेशन को अनदेखा करने के लिए बाध्यकारी को कॉन्फ़िगर कैसे करें, उन्हें संकुल को अलग करने के लिए मानचित्र करें या उन्हें मौजूदा कार्यान्वयन में मैप करें?

उत्तर

10

मैं इस के लिए एक आधे रास्ते वैकल्पिक हल समाधान है, लेकिन यह बहुत समय गहन है। मुझे डुप्लिकेट प्रविष्टियों वाली फ़ाइलों में से प्रत्येक के लिए एक अलग <execution/> बनाना था।

<executions> 
    <execution> 
    <id>jaxb-mac</id> 
    <phase>generate-sources</phase> 
    <goals> 
     <goal>generate</goal> 
    </goals> 
    <configuration> 
     <forceRegenerate>true</forceRegenerate> 
     <generatePackage>my.company.mac</generatePackage> 
     <schemaDirectory>src/main/schema</schemaDirectory> 
     <schemaIncludes> 
     <include>mac-3.4.xsd</include> 
     </schemaIncludes> 
    </configuration> 
    </execution> 
    <execution> 
    <id>jaxb-stylesheet</id> 
    <phase>generate-sources</phase> 
    <goals> 
     <goal>generate</goal> 
    </goals> 
    <configuration> 
     <forceRegenerate>true</forceRegenerate> 
     <generatePackage>my.company.stylesheet</generatePackage> 
     <schemaDirectory>src/main/schema</schemaDirectory> 
     <schemaIncludes> 
     <include>mac-stylesheet-3.4.xsd</include> 
     </schemaIncludes> 
    </configuration> 
    </execution> 

<forceRegenerate>true</forceRegenerate> महत्वपूर्ण या केवल पहले <execution/> चलेंगे और बाकी सोचेंगे चलाने के लिए है क्योंकि मैं एक ही निर्देशिका में पैदा कर रहा हूँ कोई जरूरत नहीं है कि है।

मुझे डुप्लिकेट से निपटने के लिए अभी भी कम श्रम गहन समाधान पसंद आएगा।

मुझे लगता है कि यदि मैं पहली बार मास्टर एक अलग मॉड्यूल है कि अपने स्वयं के .jar फ़ाइल में बनाता है .xsd बनाने के लिए, मैं तो <episode/> टैग इस्तेमाल कर सकते हैं और, यह पर एक ही डुप्लिकेट तत्वों को पैदा करने को छोड़ दिया है के बाद से वे समान हैं परिभाषा में

मैंने तब से एक्सएमएल छोड़ने का फैसला किया है यदि संभव हो और जेएक्सबी पूरी तरह से। XML को पार्स करने के लिए नए और बेहतर तरीके हैं और इसे इस संपादन के रूप में ऑब्जेक्ट्स पर मैप करें।

+0

' 'होने पर समाप्त हुआ है, अब' maven-jaxb2-plugin: 2.2' में उपलब्ध नहीं है। – OrangeDog

1

XSD करने के लिए एक <schemaBindings> तत्व जोड़ें:

<schemaBindings> 
    <package name="com.whatever.stuff" /> 
</schemaBindings> 

Source

+0

मैं स्रोत को संशोधित नहीं करना चाहते '.xsd' और मुझे कई बाहरी '.xjb' फ़ाइलों को या तो किसी भी विचार, काम करने के लिए नहीं मिल सकता है। मुझे एकाधिक फ़ाइलों को एकाधिक पैकेजों में संसाधित करने का स्पष्ट स्पष्टीकरण नहीं मिल रहा है। –

+0

"मैं स्रोत .xsd को संशोधित नहीं करना चाहता" - क्यों नहीं? काफी सरल लगता है। यह सिर्फ मेटाडाटा है। –

+0

मेरे पास इनमें से सैकड़ों चीजें हैं ... –

2

एहसास इस वर्ष है, लेकिन मैं एक ही त्रुटि थी और इसके द्वारा लक्ष्य पैकेज, अर्थात xjc साथ बी विकल्प को निर्दिष्ट नहीं इसे हल कर सकते हैं। फिर डुप्लिकेट तत्व प्रत्येक को अपने नामस्थान पैकेज में बनाया जाता है और कोई संघर्ष नहीं होता है।

+1

* वास्तविक * उत्तर के रूप में इसे हाइलाइट करने के लिए टिप्पणी करना, कम से कम मेरे लिए - मेरे 'maven-jaxb2-plugin' कॉन्फ़िगरेशन में '' तत्व को हटाकर मेरे लिए यह समस्या ठीक हो गई है। – DaveyDaveDave

-1

मैं Gradle के लिए मेरे समाधान पोस्ट, यह हल करती है डुप्लिकेट मुद्दा और does`not xjb फ़ाइलों की आवश्यकता:

task generateJaxb() { 
    ext.sourcesDir = "${buildDir}/generated-sources/jaxb" 
    ext.classesDir = "${buildDir}/classes/jaxb" 
    ext.schemaDir = "src/resources/schemas" 
    ext.tmp = "${buildDir}/tmp/xjc" 

    doLast() { 
     project.ant { 
      taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask", 
        classpath: configurations.jaxb.asPath 

      delete(dir: tmp) 
      mkdir(dir: tmp) 
      delete(dir: sourcesDir) 
      delete(dir: classesDir) 
      mkdir(dir: sourcesDir) 
      mkdir(dir: classesDir) 
     } 

     fileTree(schemaDir){ 
      include '**/*.xsd' 
      include '**/*.wsdl' 
     }.each{File file-> 
      //println file 
      project.ant { 
       taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask", 
         classpath: configurations.jaxb.asPath 
       xjc(destdir: tmp, schema:"${file.getAbsolutePath()}") { 
        arg(value: "-wsdl") 
        produces(dir: tmp, includes: "**/*.java") 
       } 
       copy(todir: sourcesDir) { 
        fileset(dir: tmp, erroronmissingdir: false) { 
         include(name: "**/*.java") 
        } 
       } 
       delete(dir: tmp) 
       mkdir(dir: tmp) 
      } 
     } 
     project.ant { 
      javac(destdir: classesDir, source: 1.6, target: 1.6, debug: true, 
        debugLevel: "lines,vars,source", 
        classpath: configurations.jaxb.asPath) { 
       src(path: sourcesDir) 
       include(name: "**/*.java") 
       include(name: "*.java") 
      } 

      copy(todir: classesDir) { 
       fileset(dir: sourcesDir, erroronmissingdir: false) { 
        exclude(name: "**/*.java") 
       } 
      } 
     } 
    } 
} 

configurations { 
    jaxb 
} 

dependencies { 
    jaxb("com.sun.xml.bind:jaxb-xjc:2.2.4-1") 
    compile(files(generateJaxb.classesDir).builtBy(generateJaxb)) 
} 

jar { 
    from generateJaxb.classesDir 
} 
0

हम एक ऐसी ही समस्या थी: हम एक ही में एक WSDL फ़ाइल और दो XSD फ़ाइलों था निर्देशिका। Wsdl फ़ाइल दो xsd फ़ाइलों को आयात करता है। समस्या यह थी कि जेएक्सबी सभी तीन फाइलों को ध्यान में रखकर फेंक रहा है ... 'पहले ही परिभाषित' त्रुटि है। यह मूल रूप से शिकायत कर रहा था कि यह दोनों wsdl और xsd फ़ाइल में एक ही तत्व देखा।

हम एक को बाहर निम्न उदाहरण में टैग प्लगइन विन्यास (pom.xml में) जोड़कर Maven में इस समस्या को हल कर सकते हैं:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.jvnet.jaxb2.maven2</groupId> 
      <artifactId>maven-jaxb2-plugin</artifactId> 
      <version>0.12.3</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <schemaLanguage>WSDL</schemaLanguage> 
       <generatePackage>mywsdl.wsdl</generatePackage> 
       <args><arg>-XautoNameResolution</arg></args> 
       <schemas> 
        <schema> 
         <fileset> 
          <excludes> 
           <exclude>*.xsd</exclude> 
          </excludes> 
         </fileset> 
        </schema> 
       </schemas> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
संबंधित मुद्दे