8

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

निम्नलिखित मेरे प्रोजेक्ट का सरलीकृत संस्करण है, जिसमें बिल्कुल वही व्यवहार है। प्रदर्शन के लिए विशुद्ध रूप से

APP 
    module1 
    module2 
    assembly 

मैं जोड़ लिया है निर्भरता:

दो मॉड्यूल से मिलकर एक परियोजना और एक विधानसभा मॉड्यूल पर विचार करें

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.test</groupId> 
    <artifactId>app</artifactId> 
    <version>1.0</version> 
    <packaging>pom</packaging> 

    <modules> 
    <module>module1</module> 
    <module>module2</module> 
    <module>assembly</module> 
    </modules> 
</project> 

:

com.test.app:module1:jar:1.0 
\- commons-cli:commons-cli:jar:1.2:compile 

com.test.app:module2:jar:1.0 
\- commons-daemon:commons-daemon:jar:1.0.8:compile 

यहाँ माता पिता पोम है मॉड्यूल 1 पीओएम:

<project> 
    <parent> 
    <groupId>com.test</groupId> 
    <artifactId>app</artifactId> 
    <version>1.0</version> 
    </parent> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.test.app</groupId> 
    <artifactId>module1</artifactId> 
    <version>1.0</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>commons-cli</groupId> 
     <artifactId>commons-cli</artifactId> 
     <version>1.2</version> 
    </dependency> 
    </dependencies> 
</project> 

module2 पोम:

<project> 
    <parent> 
    <groupId>com.test</groupId> 
    <artifactId>app</artifactId> 
    <version>1.0</version> 
    </parent> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.test.app</groupId> 
    <artifactId>module2</artifactId> 
    <version>1.0</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>commons-daemon</groupId> 
     <artifactId>commons-daemon</artifactId> 
     <version>1.0.8</version> 
    </dependency> 
    </dependencies> 
</project> 

विधानसभा पोम:

<project> 
    <parent> 
    <groupId>com.test</groupId> 
    <artifactId>app</artifactId> 
    <version>1.0</version> 
    </parent> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.test.app</groupId> 
    <artifactId>assembly</artifactId> 
    <version>1.0</version> 
    <packaging>pom</packaging> 

    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2.2</version> 

     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 

      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 

     <configuration> 
      <appendAssemblyId>false</appendAssemblyId> 

      <descriptors> 
      <descriptor>src/main/assembly/descriptor.xml</descriptor> 
      </descriptors> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

और अंत में, विधानसभा वर्णनकर्ता:

<assembly> 
    <id>distribution</id> 
    <includeBaseDirectory>false</includeBaseDirectory> 

    <formats> 
    <format>dir</format> 
    </formats> 

    <moduleSets> 
    <moduleSet> 
     <useAllReactorProjects>true</useAllReactorProjects> 

     <includes> 
     <include>com.test.app:module1:jar</include> 
     </includes> 

     <binaries> 
     <outputDirectory>module1</outputDirectory> 
     <unpack>false</unpack> 

     <dependencySets> 
      <dependencySet> 
      <unpack>false</unpack> 
      </dependencySet> 
     </dependencySets> 
     </binaries> 
    </moduleSet> 

    <moduleSet> 
     <useAllReactorProjects>true</useAllReactorProjects> 

     <includes> 
     <include>com.test.app:module2:jar</include> 
     </includes> 

     <binaries> 
     <outputDirectory>module2</outputDirectory> 
     <unpack>false</unpack> 

     <dependencySets> 
      <dependencySet> 
      <unpack>false</unpack> 
      </dependencySet> 
     </dependencySets> 
     </binaries> 
    </moduleSet> 
    </moduleSets> 
</assembly> 

आप देख सकते हैं, विधानसभा चरण पैकेज करने के लिए बाध्य कर रहा है । तो, जब मैं निष्पादित

mvn package 

मूल निर्देशिका से, मैं विधानसभा

module1/ 
    commons-cli-1.2.jar 
    commons-daemon-1.0.8.jar 
    module1-1.0.jar 
module2/ 
    commons-cli-1.2.jar 
    commons-daemon-1.0.8.jar 
    module2-1.0.jar 

मूल रूप से निम्नलिखित है, समस्या है कि यहाँ module1 कॉमन्स-डेमॉन पर निर्भर नहीं करता है, लेकिन विधानसभा प्लगइन शामिल किया गया है निर्भरता इसी प्रकार, मॉड्यूल 2 और कॉमन्स-क्ली के साथ।

क्या कोई समझा सकता है कि असेंबली प्लगइन इस तरह से क्यों व्यवहार करता है?

एक समाधान क्या होगा?

+0

मैं इस अजीब व्यवहार को 'मेवेन-असेंबली-प्लगइन' से उम्मीद नहीं करूंगा ... क्या आप सुनिश्चित हैं कि माता-पिता से आपकी असेंबली प्रोजेक्ट में कोई निर्भरता नहीं है? हमें असेंबली प्रोजेक्ट के लिए उत्पन्न निर्भरता पेड़ दिखाएं। –

+0

असेंबली मॉड्यूल के लिए निर्भरता पेड़ स्पष्ट रूप से खाली है, क्योंकि इसके पीओएम की कोई निर्भरता घोषणा नहीं है। – sertsy

उत्तर

10

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

उस ने कहा, एक संभावित कार्य-आसपास मॉड्यूल 1 और मॉड्यूल 2 होना चाहिए, जो अपने स्वयं के असेंबली कलाकृतियों को उत्पन्न करते हैं जिनमें उनके संबंधित जार और निर्भरताएं होती हैं। फिर आप असेंबली उप-मॉड्यूल पोम फ़ाइल को अपने भाई मॉड्यूल से उत्पन्न वितरण कलाकृतियों पर निर्भरता रखने के लिए संशोधित कर सकते हैं और फिर उन्हें एक नई असेंबली में अनपैक कर सकते हैं।

मॉड्यूल 1 और मॉड्यूल 2 की पोम फ़ाइलों दोनों में आप असेंबली उप-मॉड्यूल के साथ अपने पैकेज चरण में एक असेंबली प्लगइन कॉन्फ़िगरेशन जोड़ सकते हैं।

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2.2</version> 

     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 

     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/descriptor.xml</descriptor> 
      </descriptors> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

Module1 होगा एक src/मुख्य/विधानसभा/descriptor.xml की तरह इस

<assembly> 
    <id>distribution</id> 
    <includeBaseDirectory>false</includeBaseDirectory> 

    <formats> 
    <format>zip</format> 
    </formats> 

    <dependencySets> 
    <dependencySet> 
     <outputDirectory>module1</outputDirectory> 
     <unpack>false</unpack> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

और Module2 एक समान src/मुख्य/विधानसभा/descriptor.xml

<assembly> 
    <id>distribution</id> 
    <includeBaseDirectory>false</includeBaseDirectory> 

    <formats> 
    <format>zip</format> 
    </formats> 

    <dependencySets> 
    <dependencySet> 
     <outputDirectory>module2</outputDirectory> 
     <unpack>false</unpack> 
    </dependencySet> 
    </dependencySets> 
</assembly> 
होगा

फिर असेंबली/pom.xml में आप मॉड्यूल 1 और 2 ज़िप कलाकृतियों को निर्भरता के रूप में जोड़ देंगे

<dependencies> 
    <dependency> 
     <groupId>com.test.app</groupId> 
     <artifactId>module1</artifactId> 
     <version>1.0</version> 
     <type>zip</type> 
     <classifier>distribution</classifier> 
    </dependency> 
    <dependency> 
     <groupId>com.test.app</groupId> 
     <artifactId>module2</artifactId> 
     <version>1.0</version> 
     <type>zip</type> 
     <classifier>distribution</classifier> 
    </dependency> 
    </dependencies> 

... और विधानसभा अप ट्रिम/src/मुख्य/विधानसभा/descriptor.xml फ़ाइल इस

<assembly> 
    <id>distribution</id> 
    <includeBaseDirectory>false</includeBaseDirectory> 

    <formats> 
    <format>dir</format> 
    </formats> 

    <dependencySets> 
    <dependencySet> 
     <useTransitiveDependencies>false</useTransitiveDependencies> 
     <unpack>true</unpack> 
    </dependencySet> 
    </dependencySets> 

</assembly> 

की तरह लग रहे जैसे कि मैंने कहा था कि यह चारों ओर एक संभव काम किया जाएगा और दुर्भाग्य का एक महत्वपूर्ण राशि कहते हैं करने के लिए आपकी निर्माण प्रक्रिया के लिए अतिरिक्त एक्सएमएल विन्यास। लेकिन यह काम करता है।

+1

धन्यवाद, एक उत्तर के लिए, कीथ। जहां तक ​​मैं समझता हूं, उदाहरण में आपने दिखाया है, अगर मैं पैरेंट पीओएम से 'एमवीएन पैकेज' निष्पादित करता हूं, तो यह पहले मॉड्यूल 1 को इकट्ठा करेगा, फिर मॉड्यूल 2 और पैकेजिंग असेंबली मॉड्यूल केवल पहले दो विधानसभाओं को एक साथ रखेगा। हालांकि, यह एक अलग असेंबली मॉड्यूल के उद्देश्य को भस्म करता है। एक असेंबली के लिए एक अलग मॉड्यूल के पीछे विचार यह सुनिश्चित करना है कि असेंबली बनने पर सभी मॉड्यूल बनाए गए हैं। – sertsy

+0

मान लें कि मेरे पास एक और मॉड्यूल है - मॉड्यूल 3 जो मॉड्यूल 1 के लिए निर्भरता है। यदि मॉड्यूल 1 के पैकेज चरण में, मॉड्यूल 3 अभी तक नहीं बनाया गया है, तो मॉड्यूल 1 एक असेंबली का उत्पादन करने में सक्षम नहीं होगा (क्योंकि असेंबली पैकेज चरण से जुड़ी हुई है)। यही कारण है कि असेंबली मॉड्यूल हमेशा अंतिम रखा जाता है - यह सुनिश्चित करने के लिए कि अन्य मॉड्यूल पहले से ही बनाए गए हैं। जो सुझाव है वह मैंने जो उदाहरण दिया है, उसमें काम करेगा, लेकिन, मेरा मानना ​​है कि यह सही तरीका नहीं है। मुझे आशा है कि मैंने अपने विचार स्पष्ट कर दिए हैं। – sertsy

+1

पैरेंट पोम में सूचीबद्ध मॉड्यूल का क्रम प्रासंगिक नहीं है। मेवेन रिएक्टर सही बिल्ड ऑर्डर में सभी निर्भरताओं का निर्माण करेगा, जो यह जानता है कि कैसे करना है क्योंकि असेंबली पोम में मॉड्यूल 1 और मॉड्यूल 2 निर्भरता के रूप में सूचीबद्ध है। यहां तक ​​कि यदि आप मॉड्यूल 1 को मॉड्यूल 1 के लिए निर्भरता के रूप में जोड़ते हैं, तो यह पहले मॉड्यूल 3 का निर्माण करेगा, फिर मॉड्यूल 1, मॉड्यूल 2, असेंबली के साथ परिष्करण करेगा। – Keith