मावेन WAR निर्भरता


82

मैं स्वीकृति परीक्षण के लिए एक परियोजना लिख ​​रहा हूं और विभिन्न कारणों से यह एक अन्य परियोजना पर निर्भर है जिसे डब्ल्यूएआर के रूप में पैक किया गया है। मैं मावन-निर्भरता-प्लगइन का उपयोग करके डब्ल्यूएआर को अनपैक करने में कामयाब रहा हूं, लेकिन मैं अपने प्रोजेक्ट को अनपैक्ड WEB-INF/lib/*.jarऔर WEB-INF/classes/*क्लासपाथ पर शामिल करने के लिए शामिल नहीं कर सकता हूं ताकि बिल्ड विफल हो जाए। क्या इन फ़ाइलों को वर्गपथ में शामिल करने का कोई तरीका है, या WAR के आधार पर बेहतर तरीका है?

बहुत धन्यवाद।

जवाबों:


116

मावेन-युद्ध-प्लगइन 2.1-अल्फा -2 के बाद से एक और विकल्प है। आपके WAR प्रोजेक्ट में:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
        <attachClasses>true</attachClasses>
    </configuration>
</plugin>

यह एक वर्ग कलाकृति बनाता है जिसे आप स्वीकृति परीक्षण परियोजना में उपयोग कर सकते हैं:

<dependency>
    <groupId>your-group-id</groupId>
    <artifactId>your-artifact-id</artifactId>
    <version>your-version</version>
    <classifier>classes</classifier>
</dependency>

6
मेरे लिए इसके साथ केवल समस्या यह है कि यह सकर्मक निर्भरता में नहीं खींचती है
हर्ट्ज़स्प्रंग

1
हाँ, इस संकेत के लिए धन्यवाद :) यह मेरे लिए आंशिक रूप से काम करता है। मावेन कमांड लाइन के साथ सब कुछ ठीक है। युद्ध में कक्षाओं को संदर्भित करने वाले परीक्षणों के निर्माण (एम 2 ई) में मावेन के साथ भी ठीक है, लेकिन जब मैं परीक्षण चलाने की कोशिश करता हूं तो (junit) मुझे काम करने के लिए m2e कार्यक्षेत्र संकल्प को बंद करना होगा। अन्यथा युद्ध के संदर्भित वर्गों के लिए जूनियर रन एक ClassNotFoundException को फेंक देगा। किसी तरह उन्हें कनिष्ठ निष्पादन कक्षा में शामिल नहीं किया गया है, हालांकि युद्ध परियोजना परियोजना के निर्माण पथ में मावेन निर्भरता पुस्तकालय के तहत सूचीबद्ध है। कोई उपाय?
गैंडालफ

1
आप ट्रांजेक्टिव डिपेंडेंसी पाने के लिए प्रोजेक्ट की डिपेंडेंसी के तौर पर डिपेंडेंसी का पॉम जोड़ सकते हैं। तो आपको कक्षाओं पर और पोम पर एक निर्भरता मिलती है
योनातन क्लॉटियर

कृपया ध्यान दें, कि यह प्लगइन pom की <build> सेटिंग में जाना चाहिए।
माइकलकेवरली

मेरे मामले में मुझे src / main / resource / * की आवश्यकता थी और वे "-classes.jar" में भी शामिल हैं - महान!
जोनास बर्लिन

24

दरअसल, मावेन किसी परियोजना की निर्भरता के रूप में घोषित युद्ध की सकर्मक निर्भरता को हल नहीं करता है। वहाँ वास्तव में उस के बारे में एक समस्या है, MNG-1991 , लेकिन यह Maven 2.x में हल नहीं होगा और मुझे यकीन नहीं है कि मुझे नहीं पता कि ओवरले इस समस्या को हल करने की अनुमति देते हैं या नहीं। सुझाए गए समाधान की मेरी समझ निर्भरताओं की नकल करने के लिए है, उदाहरण के लिए एक प्रकार की परियोजना में।


(संपादित करें: कुछ और खुदाई के बाद, मुझे इस धागे में कुछ दिलचस्प लगा जो मैं नीचे उद्धृत कर रहा हूं:

मैं पिछले महीने में एपफ्यूज परियोजना के विकास में मदद कर रहा हूं जहां हम मावेन युद्ध प्लगइन में युद्ध उपरिशायी सुविधा का भारी उपयोग करते हैं। यह वास्तव में एक विशेषता है!

युद्ध के ओवरले के साथ अधिकतम शक्ति प्राप्त करने के लिए मैंने वारपाथ प्लगइन विकसित किया है जो परियोजनाओं को युद्ध कलाकृतियों को पूरी तरह से निर्भरता के रूप में उपयोग करने की अनुमति देता है। संक्षेप में:

1) युद्ध निर्भरता कलाकृतियों में / WEB-INF / कक्षाएं निर्देशिका की सामग्री को सामान्य संकलन, आदि कार्यों के लिए प्रोजेक्ट के क्लासपाथ में शामिल किया जा सकता है।
2) युद्ध निर्भरता कलाकृतियों से सकरात्मक निर्भरता अन्य प्लगइन्स, जैसे संकलित और कान द्वारा उपयोग के लिए उपलब्ध हो जाती है - इसलिए स्कीनी युद्धों को बनाते समय सभी निर्भरताओं को शामिल करने के लिए अधिक नहीं है!

प्लगइन अब सक्रिय रूप से पिछले कुछ महीनों के लिए AppFuse परियोजना में उपयोग किया गया है, और मुझे लगता है कि यह एक बिंदु पर है जहां यह उपयोग करने योग्य और स्थिर दोनों है। युद्ध प्लगइन टीम युद्ध प्लगइन के अंदर warpath कार्यक्षमता सहित में रुचि होगी? यह इसे होस्ट करने के लिए सबसे प्राकृतिक जगह होगी।

इसलिए, मुझे इसके साथ कोई अनुभव नहीं है, लेकिन मावेन युद्धपथ प्लगइन वास्तव में अच्छा और सरल दिखता है और केंद्रीय रेपो में उपलब्ध है। इसका उपयोग करने के लिए, अपनी pom.xmlफ़ाइल में निम्न प्लगइन कॉन्फ़िगरेशन तत्व शामिल करें :

[...]
<build>
  <plugins>
    <plugin>
      <groupId>org.appfuse</groupId>
      <artifactId>maven-warpath-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <extensions>true</extensions>
      <executions>
        <execution>
          <goals>
            <goal>add-classes</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
[...]

और युद्धपथों को आप वर्गपाठ में शामिल करना चाहते हैं जो युद्धपथ प्रकार की निर्भरता के रूप में शामिल हैं :

[...]
<dependencies>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>war</type>
  </dependency>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>warpath</type>
  </dependency>
</dependencies>
[...]

युद्ध और युद्धपथ निर्भरता प्रकार दोनों की आवश्यकता होती है: युद्ध ओवरले करने के लिए युद्ध प्रकार का उपयोग मावेन युद्ध प्लगइन द्वारा किया जाता है, युद्धपथ प्रकार का उपयोग प्रोजेक्ट क्लासपाथ में शामिल करने के लिए कलाकृतियों की सही सूची निर्धारित करने के लिए किया जाता है।

मैं इसे आज़माऊँगा।)


1
पास्कल, मेरी परियोजना में मेरे पास विभिन्न सर्वरों पर एकीकरण परीक्षण चलाने के लिए अलग-अलग मॉड्यूल हैं (प्रत्येक सर्वर के लिए प्रत्येक मॉड्यूल)। इन परीक्षण मॉड्यूल में परीक्षण कक्षाएं हैं और युद्ध और ओवरले की निर्भरता का उपयोग करते हैं। मैं बढ़िया काम करता हूं।
15

ठीक है, जैसा कि मैंने लिखा था, मुझे यकीन नहीं था, इसलिए उस प्रतिक्रिया के लिए धन्यवाद, यह जानना अच्छा है। क्या आप केवल इस बात की पुष्टि कर सकते हैं कि यह युद्ध की सकर्मक निर्भरता के साथ काम करता है न कि युद्ध के जावा वर्गों के लिए?
बजे पास्कल थिवेंट

ठीक है धन्यवाद। मैं देखता हूं कि अब यह कैसे काम करता है (महत्वपूर्ण हिस्सा आपका दूसरा वाक्य है: आपके परीक्षण परियोजना को भी पैकेजिंग युद्ध की आवश्यकता है )।
पास्कल थिवेंट

1
इस प्लगइन के साथ मुझे जो समस्या है वह यह है कि यह m2eclipse द्वारा समर्थित नहीं है: maven.40175.n5.nabble.com/…
milan

यह प्लगइन Maven रिलीज़ और असेंबली प्लग इन दोनों को भी तोड़ता है क्योंकि ये दोनों एक WAR की निर्भरता को हल करने का प्रयास करेंगे जो Warpath प्लगइन का उपयोग करता है, Maven यह कहकर तोड़ देगा कि यह प्रकार = warpath निर्भरता को हल नहीं कर सकता है। बहुत बुरा यह काम नहीं करता है।
HDave

14

ओवरले का उपयोग करें । सबसे पहले, आपके परीक्षण प्रोजेक्ट को भी पैकेजिंग की आवश्यकता है war

आप परीक्षण करना चाहते युद्ध परियोजना की निर्भरता की घोषणा:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>your-project-arftifactId</artifactId>
    <version>${project.version}</version>  
    <type>war</type>
    <scope>test</scope>
</dependency>

फिर मावेन-युद्ध-प्लगइन ओवरले कॉन्फ़िगर करें:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <webResources>
                <resource>
                    <directory>${basedir}/src/main/webresources</directory>
                    <filtering>true</filtering>
                </resource>
            </webResources>
            <overlays>
                <overlay/>
                <overlay>
                    <groupId>your.group</groupId>
                    <artifactId>your-project-artifactId</artifactId>
                </overlay>
            </overlays>
        </configuration>
    </plugin>

परीक्षण परियोजना में उपर्युक्त उदाहरण में, मैं विन्यास फाइल (जैसे संदर्भ आदि) के वेबसर्वर को अधिलेखित करता हूं।

संपादित करें: इस समाधान Maven 3 के साथ परीक्षण नहीं किया गया था।


1
इसका परीक्षण करने से पहले मैंने इसे नीचे वोट दिया। मुझे नहीं पता कि यह इसलिए है क्योंकि मैं Maven3 का उपयोग कर रहा हूं, लेकिन वास्तव में मेरे / वर्गों और / lib फ़ोल्डरों दोनों को कई WAR निर्भरता के माध्यम से पारगमन में शामिल किया जा रहा है। फिर से - यह नीचे मतदान के लिए खेद है। जाहिर है, यह "सही" उत्तर है।
एचडीवी

4

अच्छी बात है, जस्टिन। मुझे वास्तव में मेरी समस्या का समाधान मिल गया है, अर्थात्: एक युद्ध में एक विधानसभा और इसके सभी पारगमन निर्भरता सहित। मैं 'जार' के रूप में युद्ध-निर्भरता की नकल नहीं कर सकता क्योंकि आपने सुझाव दिया था कि असेंबली प्लगइन उस समूह द्वारा संदर्भित जार नहीं मिलेगा / artefactId, लेकिन

  • टाइप पोम के रूप में युद्ध-निर्भरता की नकल करना

काम करता है! युद्ध और इसकी सकर्मक निर्भरता विधानसभा में शामिल नहीं हैं। (अब भी दिखने वाली) pom फ़ाइल को बाहर करने के लिए मुझे इस तरह से एक बहिष्कृत तत्व जोड़ना पड़ा:

  <excludes>
    <exclude>*:pom</exclude>
  </excludes>

मेरी असेंबली में। xml फ़ाइल।

मुझे लगता है कि यह इस धागे के मूल प्रश्न के लिए एक समाधान भी हो सकता है।


-1

यदि आप युद्ध परियोजना पर निर्भरता को जार निर्भरता के रूप में सूचीबद्ध करते हैं, तो यह आवश्यक जार / संसाधनों को पिक करने के लिए लगता है। मैं Maven 2.2 + m2eclipse का उपयोग कर रहा हूं।

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