बहु मॉड्यूल परियोजना में मावेन परीक्षण निर्भरता


86

मैं मल्टी मॉड्यूल प्रोजेक्ट बनाने के लिए मावेन का उपयोग करता हूं। मेरा मॉड्यूल 2 परीक्षण के दायरे में मॉड्यूल 1 src संकलन के दायरे और मॉड्यूल 1 परीक्षणों पर निर्भर करता है।

मॉड्यूल 2 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>test</scope>
   </dependency>

यह ठीक काम करता है। मान लें कि मेरा मॉड्यूल 3 संकलन समय पर मॉड्यूल 1 src और परीक्षणों पर निर्भर करता है।

मॉड्यूल 3 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>compile</scope>
   </dependency>

जब मैं चलता हूं mvn clean install, तो मेरा निर्माण मॉड्यूल 3 तक चलता है, मॉड्यूल 3 पर विफल रहता है क्योंकि यह मॉड्यूल 1 परीक्षण निर्भरता को हल नहीं कर सकता है। फिर मैं mvn installअकेले मॉड्यूल 3 पर काम करता हूं , वापस जाओ और mvn installइसे बनाने के लिए अपने मूल पोम पर चलाएं । मैं इसे कैसे ठीक करूं?


क्या आप कृपया साझा कर सकते हैं कि आपके पैरेंट पोम कैसा दिखता है?
क्रिस गमर

जवाबों:


127

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

ध्यान दें कि इस मार्गदर्शिका के पिछले संस्करणों ने <classifier>tests</classifier>इसके बजाय उपयोग करने का सुझाव दिया था <type>test-jar</type>। हालांकि यह वर्तमान में कुछ मामलों के लिए काम करता है, यह परीक्षण JAR मॉड्यूल और किसी भी उपभोक्ता के रिएक्टर बिल्ड के दौरान ठीक से काम नहीं करता है अगर एक जीवनचक्र चरण को स्थापित करने से पहले लागू किया जाता है। ऐसे परिदृश्य में, मावेन रिएक्टर बिल्ड के उत्पादन से परीक्षण JAR को हल नहीं करेगा, लेकिन स्थानीय / दूरस्थ भंडार से। जाहिरा तौर पर, रिपॉजिटरी से JAR पुराना या पूरी तरह से गायब हो सकता है, जिससे बिल्ड फेल हो सकता है (cf. MNG-2045 )।

इसलिए, पहले, एक JAR में संकलित परीक्षणों को पैकेज करने के लिए और उन्हें सामान्य पुन: उपयोग के लिए तैनात करें, maven-jar-pluginनिम्नानुसार कॉन्फ़िगर करें :

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.2</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

फिर, परीक्षण JAR विरूपण साक्ष्य को हमेशा की तरह प्रयोग (स्थापित mvn installया mvn deploy) करें।

अंत में, परीक्षा JAR का उपयोग करने के लिए, आपको एक निर्दिष्ट प्रकार के साथ एक निर्भरता निर्दिष्ट करनी चाहिए test-jar:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>

3
पास्कल। सबसे पहले सभी मावेन सवालों के जवाब देने के लिए बहुत बहुत धन्यवाद !! इस सवाल के बारे में। मुझे अभी भी एक समस्या है। मेरे पास मेरे एक मुख्य मॉड्यूल में कुछ टेस्टबेस क्लास है जो मैं सभी चाइल्ड ऑब्जेक्ट्स में उपयोग करना चाहता हूं। हमारे पास सीआई में मावेन निर्माण है। अगर मैं टेस्ट-जार पर तैनाती की कोई भी स्थापना नहीं करना चाहता और बस ट्रंक से एक नई प्रतिलिपि की जाँच करना और मावन परीक्षण चलाना। यह विफल रहता है, क्योंकि मेरे पास अभी तक कहीं भी टेस्ट-जार नहीं है। किसी भी विचार है कि कैसे से निपटने के लिए?
रोमन

@ रमन रनिंग इंस्टॉल "प्राकृतिक" तरीका है। लेकिन ऐसा लगता है कि आपको वर्कअराउंड मिला।
पास्कल थिवेंट

ऐसा लगता है कि यह मुद्दा 3559 नहीं 2045 है जो इस बिंदु पर पकड़ है: jira.codehaus.org/browse/MNG-3559
HDave

कम से कम यह बताता है कि यह क्या हो रहा है यह समाधान प्रदान नहीं करता है। यह सिर्फ वही करने का सुझाव देता है जो ओपी (और उदाहरण I) पहले से कर रहा है।
एंटोनियोसस

19

पास्कल्स के सवाल के बारे में मेरी टिप्पणी के बारे में मुझे लगता है कि मुझे एक कठिन जवाब मिल गया है:

<plugins>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
            <phase>test-compile</phase>
        </execution>
        </executions>
        <configuration>
            <outputDirectory>${basedir}\target</outputDirectory>
        </configuration>
    </plugin>
</plugins>

जैसा कि आप यहाँ देख रहे हैं मुख्य अंतर <phase>टैग है।

मैं परीक्षण-जार बनाऊंगा और यह परीक्षणों के संकलन चरण में उपलब्ध होगा और न केवल पैकेज चरण के बाद।

मेरे लिये कार्य करता है।


1
हाँ, बहुत सुविधाजनक है। साझा करने के लिए धन्यवाद। मुझे लगता है कि जब आपके पास कॉर्पोरेट डायरेक्टरी होती है, तो तैनाती का दृष्टिकोण बेहतर होता है (हां, मुझे पता है कि यह दृढ़ता से अनुशंसित है)। धन्यवाद @ रोमन
डेमियन

2

जैसा कि https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html कहता है:

जार को टेस्ट कक्षाओं से कैसे बनाएं जब आप टेस्ट-क्लास युक्त जार बनाना चाहते हैं, तो आप शायद उन कक्षाओं का पुनः उपयोग करना चाहेंगे। इसे हल करने के दो तरीके हैं:

  1. The easy way वर्तमान परियोजना से परीक्षण-कक्षाओं के साथ एक संलग्न जार बनाएं और इसकी सकर्मक परीक्षण-स्कॉप्ड निर्भरता को ढीला करें।

  2. The preferred way परीक्षण-कक्षाओं के साथ एक अलग परियोजना बनाएं।

कृपया विस्तार से उस लेख को पढ़ें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.