2012-08-15 11 views
10

मेरे पास मेवेन-आधारित प्रोजेक्ट है, जिसमें मैं "जैक्सबी 2-मेवेन-प्लगइन" मेवेन प्लगइन द्वारा स्वचालित रूप से जेनरेट किए गए कुछ जेएक्सबी कक्षाओं को जोड़ने की कोशिश कर रहा हूं। हालांकि, मेरे पहले कट में मुझे एक परिपत्र निर्भरता लूप में है:मैवेन प्रोजेक्ट में जेएक्सबी-जेनरेटेड क्लासेस का प्रबंधन

  • क्योंकि ये जेएक्सबी कक्षाएं अभी तक उत्पन्न नहीं हुई हैं, मेरे अन्य स्रोत जो उनके संदर्भ में संकलन त्रुटियां हैं।
  • क्योंकि उन अन्य स्रोतों में संकलन त्रुटियां हैं, ये जेएक्सबी कक्षाएं उत्पन्न नहीं होती हैं।

ऐसा लगता है इस को हल करने के लिए दो स्पष्ट संभावनाओं देखते हैं जैसे:

  1. टिप्पणी से बाहर टूटी हुई संदर्भ, ताकि परियोजना बनाता है और JAXB वर्गों स्वचालित रूप से उत्पन्न होता है। फिर उन उत्पन्न स्रोतों को /target से /src/main/java में कॉपी करें, ताकि उनके संदर्भों में संकलन त्रुटियों का कारण न हो।
  2. एक पूरी तरह से अलग परियोजना बनाएं, जिसमें जैक्सबी सामान के अलावा कुछ भी शामिल नहीं है। इसे मेरे मुख्य प्रोजेक्ट में निर्भरता के रूप में शामिल करें।

क्या मुझे यहां कुछ याद आ रही है? विकल्प # 1 फ्लैट-आउट हास्यास्पद लगता है ... कि केवल वह तरीका हो सकता है जिसमें लोग JAXB का उपयोग करते हैं। विकल्प # 2 अधिक तर्कसंगत लगता है, लेकिन फिर भी अक्षम और बोझिल है। मुझे वास्तव में जेएक्सबी का उपयोग करने के लिए पूरी तरह अलग परियोजना का ओवरहेड लेना है?

क्या कोई और सुरुचिपूर्ण दृष्टिकोण है जो डेवलपर्स उसी परियोजना में जेएक्सबी-जेनरेटेड कक्षाओं का संदर्भ देने के लिए उपयोग करते हैं जहां मेवेन प्लगइन उन्हें उत्पन्न करता है?

अद्यतन:

<build> 
    <plugins> 
     <plugin> 
      <!-- configure the compiler to compile to Java 1.6 --> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin>  
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>jaxb2-maven-plugin</artifactId> 
      <version>1.4</version> 
      <executions> 
       <execution> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>xjc</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <!-- The name of your generated source package --> 
       <packageName>com.mypackage</packageName> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

जब मैं mvn clean package चलाने के लिए, मैं देख रहा हूँ मेरी JAXB सूत्रों के नीचे /target उपनिर्देशिका उत्पन्न किया जा रहा DO: अनुरोध करके, यहाँ मेरी पोम के संबंधित भाग है। हालांकि, संकलित चरण के लिए उन उत्पन्न स्रोतों को क्लासपाथ में स्वचालित रूप से जोड़ा नहीं जा रहा है।

बाद संकल्प अद्यतन: ऐसा लगता है कि मेरे संकलन मुद्दों तथ्य यह है कि मैं ग्रहण में चल रहा था के साथ क्या करना अधिक था, और इसके Maven एकीकरण "jaxb2-Maven-प्लगइन" के साथ कुछ मुद्दों है। उस मुद्दे और उसके समाधान पर अधिक जानकारी के लिए this StackOverflow question देखें।

+0

कृपया पीओएम के प्रासंगिक अनुभाग पोस्ट करें। – jiggy

उत्तर

7

मैं आपको जैक्सब-जेनरेटेड क्लास (एपीआई) और आपके बीएल वर्ग (कार्यान्वयन) को 2 मेवेन प्रोजेक्ट्स को अलग-अलग pom.xml के साथ विभाजित करने के लिए सुझाव दूंगा, और मुख्य रूट pom.xml संकलन आदेश के साथ। इस तरह, आप api.jar बनाने में सक्षम होंगे, तो मैवेन इसे स्थानीय रेपो के अंदर स्थापित करेगा, और इसके बाद आप इसे अपने कार्यान्वयन की निर्भरता के रूप में उपयोग कर सकते हैं। तो ऐसा लगता है:

-API\ 
--pom.xml - for api, jaxb generation 
-IMPL\ 
--pom.xml - for impl, api dependency is here 
pom.xml - main pom.xml with references to the projects above 
+0

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

9

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

संपादित: यह मेरा कोड हम काम पर का उपयोग करें (और कौन-सा उम्मीद काम करता है) है:

<plugin> 
      <groupId>com.sun.tools.xjc.maven2</groupId> 
      <artifactId>maven-jaxb-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <schemaDirectory>src/main/resources/<companyname>/xsd</schemaDirectory> 
       <includeSchemas> 
        <includeSchema>retrieval.xsd</includeSchema> 
        <includeSchema>storage.xsd</includeSchema> 
       </includeSchemas> 
      </configuration> 
     </plugin> 

जाहिर है हम अभी तक एक और JAXB प्लगइन का उपयोग ... (भी इस सूत्र देखें: Difference of Maven JAXB plugins) ।

+0

मैंने अपने पीओएम के प्लगइन हिस्से को शामिल करने के लिए मूल प्रश्न अपडेट किया है। –

3

शायद का उपयोग कर maven-jaxb2-plugin ऐसा करें:

<plugin> 
    <groupId>org.jvnet.jaxb2.maven2</groupId> 
    <artifactId>maven-jaxb2-plugin</artifactId> 
    <version>0.8.2</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>generate</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

dfuse से जवाब सही है, हालांकि है। या तो प्लगइन संकलन से पहले स्रोत उत्पन्न करना चाहिए, और स्रोत पीढ़ी का परिणाम कक्षापथ पर होगा। मैंने दोनों प्लगइन के साथ इसका परीक्षण किया। क्या आपके लिए स्कीमा पोस्ट करना संभव है, या कम से कम स्कीमा जिस प्रकार आपका कोड क्लासपाथ पर लेने में असफल रहा है?

+0

मैं उपयोग करता हूं और org.jvnet प्लगइन भी अनुशंसा करता हूं। अगर आपकी समस्या शुक्रवार तक हल नहीं होती है, तो मैं काम पर पोम्स से तुलना कर सकता हूं, देखें कि क्या गुम हो सकता है। –

+0

सुधार, मैं उस प्लगइन का उपयोग नहीं करता (हालांकि मैंने इसे आजमाया है)। मैंने अपना जवाब मेरे जवाब में पोस्ट किया। –

संबंधित मुद्दे