2010-08-20 12 views
7

मान लीजिए कि मेरे पास मॉड्यूल A:jar है, जिसका रनटाइम और निर्भरता सेट संकलन जेडीके संस्करण पर निर्भर करता है। मेरे उदाहरण में, मेरे पास pre-jdk6-profileJAXB एपीआई के लिए है: जेडीके 1.6.0 से पहले मुझे संकलन निर्भरता के रूप में jaxb-api-nnn.jar शामिल करने की आवश्यकता है। यह प्रोफ़ाइल A.pom पर रखी गई है।एक निर्भर मॉड्यूल में मेवेन प्रोफाइल कैसे सक्रिय करें?

मेरे पास मॉड्यूल B:war भी है, जो A:jar पर निर्भर करता है। मैं JDK 1.5.x वितरित करने योग्य बनाने के लिए एक बिल्ड सर्वर पर इस प्रोफ़ाइल को सक्रिय करने में सक्षम होना चाहता हूं। जब मैं सक्रिय किसी दिए गए प्रोफाइल के साथ Maven निष्पादित, मैं संदेश मिलता है:

mvn -Ppre-jdk6-profile -o install 
[WARNING] 
     Profile with id: 'pre-jdk6-profile' has not been activated. 

और jaxb-api-nnn.jarB.war जिसके परिणामस्वरूप में याद आ रही है। हालांकि अगर मैं इस प्रोफ़ाइल को माता-पिता pom.xml से बनाते समय सक्रिय करता हूं, तो सबकुछ ठीक है। इसका मतलब है कि प्रोफाइल निर्भरताओं से विरासत में नहीं हैं, और माता-पिता बहु-मॉड्यूल pom.xml सबकुछ सही ढंग से बनाने में सक्षम था क्योंकि ऐसा लगता है कि सभी प्रोफाइल रिएक्टर में विलय कर रहे हैं।

प्रोफ़ाइल को पैरेंट पोम में स्थानांतरित करना चीजों को और भी खराब बनाता है, क्योंकि निर्भरता अन्य सभी परियोजनाओं पर लागू होती है (उदाहरण के लिए C:ear)। क्या इस कार्य के लिए कोई अच्छा समाधान है, अर्थात्, यदि कोई मॉड्यूल A मॉड्यूल B पर निर्भर करता है, तो प्रोफ़ाइल द्वारा सक्रिय किए गए सभी संकलित और रनटाइम निर्भरताओं को सही तरीके से संभाला जाता है?

प्रोफ़ाइल परियोजना A:jar में इस प्रकार है:

<project ...> 
    <artifactId>A</artifactId> 
    <packaging>jar</packaging> 
    ... 
    <parent> 
     <artifactId>P</artifactId> 
     ... 
    </parent> 

    <profiles> 
     <profile> 
      <id>pre-jdk6-profile</id> 

      <activation> 
       <jdk>(,1.6.0)</jdk> 
      </activation> 

      <dependencies> 
       <dependency> 
        <groupId>javax.xml.ws</groupId> 
        <artifactId>jaxws-api</artifactId> 
       </dependency> 
      </dependencies> 
     </profile> 
    </profiles> 
... 
</project> 

उत्तर

8

क) एक बहु मॉड्यूल निर्माण में, आप हमेशा शीर्ष पोम से, बनाने चाहिए एक व्यक्ति मॉड्यूल से कभी नहीं। आप केवल एक मॉड्यूल का निर्माण उन्नत रिएक्टर विकल्पों का उपयोग करना चाहते हैं तो इस तरह (mvn --help देखें):

mvn -pl mymodule 

ख) को परिभाषित करें और माता पिता के पोम में प्रोफाइल सक्रिय है, लेकिन बच्चे पोम में विन्यास जोड़ने ।

माता पिता pom.xml

<profiles> 
    <profile> 
     <id>pre-jdk-6</id> 
     <activation> 
      <jdk>(,1.6.0)</jdk> 
     </activation> 
    </profile> 
</profiles> 

बच्चे pom.xml

<profiles> 
    <profile> 
     <id>pre-jdk-6</id> 

     <dependencies> 
      <dependency> 
       <groupId>javax.xml.ws</groupId> 
       <artifactId>jaxws-api</artifactId> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 
+0

क्या मुझे मॉड्यूल 'ए' या मॉड्यूल' बी' में दूसरा भाग जोड़ने की आवश्यकता है? –

+0

दोनों। JAR में ' के साथ' प्रदान किया गया, डिफ़ॉल्ट क्षेत्र के साथ वेबपैप में। लेकिन प्रोफ़ाइल के अंदर दोनों में। –

+0

मेरा मानना ​​है कि, मैं केवल (बी) का उपयोग कर सकता हूं यदि मैं हडसन पर चलता हूं।आपके लिए धन्यवाद संकेत। –

1

कई नोटों तरह से इस तथ्य के बाद:

  1. जब आप -P profName उपयोग करें, यह नाम से एक प्रोफ़ाइल को सक्रिय करता है ' profName '
  2. उसके बाद, यह सभी प्रोफ़ाइल अक्षम करता है एस के लिए <activation> टैग है। इससे कोई फर्क नहीं पड़ता कि वे जावा संस्करण द्वारा सक्रिय हैं, उदाहरण के लिए, या डिफ़ॉल्ट या env मान या कुछ भी।
  3. इसका मतलब है कि -पी किसी भी अन्य सक्रिय प्रोफ़ाइल को निष्क्रिय होने का कारण बनता है।

समाधान: या तो <activation><jdk>...</jdk></activation> का उपयोग करें या -P का उपयोग करें, लेकिन दोनों का उपयोग न करें।

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