2011-10-04 11 views
5

मेरे पास एक प्रोजेक्ट a:jar के साथ एक प्रोजेक्ट है जिसके लिए निर्भरता के एक अलग सेट की आवश्यकता है, यह निर्भर करता है कि यह किस प्लेटफॉर्म को संकलित किया गया है। कोड सभी प्लेटफार्मों के लिए समान है। जैसे एंड्रॉइड पर httpcomponents लाइब्रेरी पहले ही ओएस के साथ बंडल की गई है, जबकि मुझे इसे जे 2 एसई वातावरण के लिए बनाने के लिए शामिल करना है। मेरे पास एक और सबमिशन भी है, जो कई submodules और उनकी निर्भरताओं को एक संग्रह में इकट्ठा करता है। संबंधित मंच के लिए संकलित सभी submodules, और उस प्लेटफॉर्म के लिए उपयुक्त उनकी निर्भरताओं को लेने के लिए, मैं असेंबली सबमिशन को विश्वसनीय रूप से कॉन्फ़िगर कैसे कर सकता हूं?विभिन्न प्लेटफार्मों के लिए बनाता है मेवेन मार्ग

मैंने a:jar:android और a:jar:j2se बनाने के लिए प्रोफाइल का उपयोग करने का प्रयास किया। हालांकि, इनमें से किसी एक पर निर्भरता घोषित करने से असेंबली में अजीब निर्भरताएं आती हैं। I.e, असेंबली प्रोजेक्ट के dependency:tree में कभी-कभी a:jar:j2se पर निर्भरता शामिल होगी (इससे कोई फर्क नहीं पड़ता कि मैंने असेंबली में a:jar:android या a:jar:j2se का उपयोग करने की घोषणा की है), और कभी-कभी अन्य। स्थानीय भंडार में a के जार अपडेट करने के बाद यह अक्सर बदल गया (अक्सर)। असेंबली प्रोजेक्ट में स्विचिंग प्रोफाइल का भी उपयोग करता है।

मैं उस by applying the same dependencies to the assembly project's profiles को हल कर सकता हूं जैसा कि व्यक्तिगत submodules प्रोफ़ाइल द्वारा आवश्यक है। लेकिन जैसा कि मुझे पीओएम में खुद को दोहराना है, शायद यह हासिल करने के लिए एक और अधिक मैवेन-वाई तरीका है। जैसा कि मैं मैवेन के लिए काफी नया हूं, मुझे आश्चर्य है कि यह क्या है? मैं कोड को डुप्लिकेट नहीं करना चाहता (जो कोड के समान रहता है और भी दोहराना होगा) और मैं पीओएम के हिस्सों को डुप्लिकेट करना पसंद नहीं करता क्योंकि उन्हें संस्करण उन्नयन के कारण बदलना जटिल हो सकता है।

कुछ ठोस सामग्री: a:jar के पोम से निर्भरता:

<dependencies> 
    ..... 
    <dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpmime</artifactId> 
     <version>4.0.1</version> 
     <scope>compile</scope> 
     <!-- Exclusion in the common part, they are provided in the profiles from different sources --> 
     <exclusions> 
     <exclusion> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
     </exclusion> 
     .... 
     </exclusions> 
    </dependency> 
    </dependencies> 
    <profiles> 
    <profile> 
     <id>android</id> 
     <dependencies> 
     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>android</artifactId> 
      <version>1.6_r2</version> 
      <scope>provided</scope> 
     </dependency> 
     </dependencies> 
    </profile> 
    <profile> 
     <id>java</id> 
     <dependencies> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <version>4.0.1</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>commons-codec</groupId> 
      <artifactId>commons-codec</artifactId> 
      <version>1.3</version> 
      <scope>compile</scope> 
     </dependency> 
     </dependencies> 
    </profile> 
    </profiles> 

विधानसभा परियोजना (जो Maven विधानसभा प्लगइन का उपयोग करता है) प्रोफाइल:

<profiles> 
    <profile> 
     <id>android</id>  
     <dependencies> 
     <dependency> 
      <groupId>a</groupId> 
      <artifactId>a</artifactId> 
      <version>${project.version}</version> 
      <classifier>android</classifier> 
      <type>jar</type> 
     </dependency> 
     <!-- Duplicate --> 
     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>android</artifactId> 
      <version>1.6_r2</version> 
      <scope>provided</scope> 
     </dependency> 
     <!-- Duplicate --> 
     </dependencies> 
    </profile> 
    <profile> 
     <id>java</id> 
     <dependencies> 
     <!-- Duplicate --> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <version>4.0.1</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>commons-codec</groupId> 
      <artifactId>commons-codec</artifactId> 
      <version>1.3</version> 
      <scope>compile</scope> 
     </dependency> 
     <!-- /Duplicate --> 
     <dependency> 
      <groupId>a</groupId> 
      <artifactId>a</artifactId> 
      <version>${project.version}</version> 
      <classifier>java</classifier> 
     <type>jar</type> 
     </dependency> 
     </dependencies> 
    </profile> 
    </profiles> 

मैं से छुटकारा पाने के लिए करना चाहते हैं चिह्नित निर्भरता घोषणाएं।

उत्तर

3

कई समाधान कर रहे हैं:

  1. ये submodule के निर्भरता "प्रदान" घोषित किया जा सकता है, एक परियोजना में इस मामले में आप स्पष्ट निर्भरता जो एक मंच नहीं है के साथ submodule के लिए निर्भरता शामिल ।

  2. अनावश्यक निर्भरताओं के लिए <exclusions> का उपयोग करें।

  3. ऊपर (1) या (2) का उपयोग करके एक और "संरचनात्मक" सबोडोड्यूल ए-एंड्रॉइड बनाएं: पोम ए-जे 2se: पोम जो निर्भरता का वर्णन करता है, और इन मॉड्यूल से इन मॉड्यूल का उपयोग करें।

+0

तो (3), "एक-JSE: पोम" के लिए: "एक" से विरासत हैं>http://maven.apache.org/guides/introduction/introduction-to-profiles.html

आपके मामले में यह कुछ इस तरह हो सकता है - यहाँ प्रोफाइल पर एक लेख है। "ए" के पोम में मैं किसी भी (या केवल आम) निर्भरताओं की घोषणा नहीं करता हूं। असेंबली प्रोजेक्ट में मैं "ए-जेएसई: पोम" पर निर्भर करता हूं - क्या यह सही है? यह एक अच्छा तरीका लगता है ... – Stephan

+0

हाँ, ठीक है।मुझे लगता है कि आपको "ए" में कुछ निर्भरताओं की घोषणा करनी है क्योंकि वे संकलन के लिए आवश्यक हो सकते हैं। यही कारण है कि आपको या तो (1) या (2) करना है। साथ ही, "असेंबली" शब्द से भ्रमित न हों, यह "मेवेन असेंबली प्लगइन" से कोई लेना देना नहीं है। – kan

+0

मैंने मूल पोस्टिंग को अधिक ठोस कोड रखने के लिए अपडेट किया। अभी मैं यह समझने की कोशिश कर रहा हूं कि कैसे "ए" और "ए-जे 2se" को एक दूसरे से सही तरीके से प्राप्त करना चाहिए। – Stephan

2

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

<profiles> 
    <profile> 
    <activation> 
     <os> 
     <family>Windows</family> 
     </os> 
    </activation> 
    <dependencies> 
     ... specific dependencies for Windows 
    </dependencies> 
    <plugins> 
     ... specific build plugins for Windows 
    </plugins> 
    </profile> 
    <profile> 
    <activation> 
     <os> 
     <family>unix</family> 
     </os> 
    </activation> 
    <dependencies> 
     ... specific dependencies for unix 
    </dependencies> 
    <plugins> 
     ... specific build plugins for unix 
    </plugins> 
    </profile> 
    <dependencies> 
    ... Common dependencies 
    <dependencies> 
    <plugins> 
    ... Common build plugins 
    </plugins> 
</profiles> 
+2

ओएस-विशिष्ट प्रोफ़ाइल यहां उचित नहीं है। यह बिल्ड-सर्वर ओएस पर निर्भर करता है, लेकिन लक्ष्य ओएस पर नहीं। इसके अलावा, यह बहुत संभव है कि कई लक्ष्य प्लेटफार्मों के लिए कई परियोजनाओं को एक साथ बनाना आवश्यक होगा। – kan

+0

@kan। आप हमेशा ओएस-विशिष्ट कलाकृतियों को उत्पन्न कर सकते हैं (वास्तव में आपको यह करना होगा यदि आप विभिन्न ओएस के लिए अलग-अलग घटक प्रदान करते हैं)। साथ ही, रिलीज के निर्माण के दौरान, आप नाम से प्रोफाइल सक्रिय कर सकते हैं, ताकि आप अपने सीआई सर्वर पर आवश्यक सभी प्रोफाइल बना सकें, और केवल अपनी देव मशीन पर अपने देव पर्यावरण के लिए उपयुक्त हों। –

+0

यदि आप अलग-अलग ओएस-एस के लिए विभिन्न मॉड्यूल का उपयोग करेंगे तो आप रूट pom.xml बना सकते हैं जिसमें उनमें से सभी को '' के रूप में शामिल किया जाएगा और सबकुछ एक साथ बनाया जाएगा। प्रोफाइल के लिए आपको विभिन्न प्रोफाइल सक्रियण के साथ कई बार मेवेन का आह्वान करना पड़ता है। – kan

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

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