2012-06-22 10 views
6

मै मैवन के लिए नया हूं और मैं कुछ परियोजनाओं को मेवेन पर काम करने के लिए परिवर्तित करने की कोशिश कर रहा हूं और मुझे यकीन नहीं है कि उन्हें ढांचा बनाने का सही तरीका क्या है - यहां मैं यही हूं है:मेवेन प्रोजेक्ट डिज़ाइन - एक आम प्रोजेक्ट साझा करना

मेरे पास एक सामान्य मॉड्यूल है - नाम Common और दो अलग-अलग अनुप्रयोग जिनमें तथ्य से कुछ भी नहीं है, वे दोनों Common पर निर्भर करते हैं। आइए उन्हें A और B पर कॉल करें। >Common और B - -

A के बीच निर्भरता>Common दोनों क्रम के लिए और परीक्षण के लिए कर रहे हैं - जिसका अर्थ है कि A रों परीक्षण कक्षाओं की परीक्षा कक्षाओं Common की आवश्यकता होती है '।

मैंने विभिन्न संयोजनों की कोशिश की जो मैं सोच सकता था - लेकिन उनमें से कोई भी जो मैं चाहता हूं उसका उत्पादन नहीं किया। अजीब बात यह है कि मेरा कोड संकलित करता है, लेकिन Common से टेस्ट क्लास क्लासपाथ में नहीं मिले हैं, इसलिए JUnits विफल हो जाते हैं।

मैं Common करने के लिए 2 प्रोफाइल जोड़ना चाहिए 2 कलाकृतियों बना सकते हैं और दोनों कलाकृतियों को A और B में 2 निर्भरता को जोड़ने के लिए? (क्या यह संभव है?) क्या मैं चाहता था कि ऐसा करने का कोई सही तरीका है? क्या मुझे अपने कोड को मेवेन फिट करने के लिए पुनर्गठन करना चाहिए?

उत्तर

5

का उपयोग कर सकते हैं यह एक आम मैवेन पिटफॉल है। जब आप उस आर्टिफैक्ट पर निर्भर करते हैं तो एक आर्टिफैक्ट से टेस्ट क्लासेस उपलब्ध नहीं होते हैं। यह वास्तव में उचित है: जब आप Common पर निर्भर करते हैं, तो आप उत्पादन कक्षाओं (JAR फ़ाइल) पर निर्भर करते हैं। परीक्षण कक्षाओं को केवल परीक्षण चलाने के लिए जरूरी है और अंतिम जार में भी शामिल नहीं हैं। - में आम उपयोगिता परीक्षण वर्गों (! मामलों का परीक्षण नहीं) युक्त

  • Common-test:

    अपने Common परीक्षण कक्षाओं मान लिया जाये कि सभी Common परीक्षण, A और B परीक्षण के लिए आवश्यक कुछ उपयोगिता विधि होते हैं, यहाँ एक सुझाव संरचना है /src/main/java (!)

  • Common<scope>test</scope>
  • A और B साथ Common-test पर निर्भर करता है ((test गुंजाइश के साथ दोनों Common पर निर्भर डिफ़ॉल्ट की संभावना) और Common-test साथ)

UML

+0

ठंडा, आप किस उपकरण को आकर्षित करने के लिए उपयोग करते थे? –

+0

इस आरेख को बनाने के लिए आपने क्या उपयोग किया? साफ दिखता है। – zengr

+2

@zengr: http://yuml.me/ –

2

आप

  • आम परियोजना है जैसे कि यह संरचना सकता
  • एक परियोजना
  • बी परियोजना

अब के लिए A & B<dependency> को CommonProject जोड़ने के लिए, कि commonproject पर उपलब्ध कर देगा समय संकलित करें ताकि निर्माण अच्छा हो जाए,

अपने एक & बी है या webapp archtype तो आप सुनिश्चित करें कि आपके निर्भरता इतना है कि यह क्रम

केवल test पर निर्भरता उपलब्ध कराने के लिए पर निर्भरता प्राप्त कर सकते हैं वेब-INF/lib में उपलब्ध हैं बनाने के लिए की जरूरत है समय, आप test scope

2

आप की test-jar लक्ष्य को चलाने के लिए है maven-jar-plugin आपके Common प्रोजेक्ट में।

यह tests वर्गीकरण के साथ एक नया आर्टिफैक्ट उत्पन्न करता है, जिसमें src/test पेड़ से सभी वर्ग और संसाधन शामिल हैं।

तो, आम में जोड़ें:

<plugins> 
    ... 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>test-jar</id> 
     <goals> 
      <goal>test-jar</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
    ... 
</plugins> 

और A में और B इस निर्भरता घोषणा में जोड़ने के इस

<dependency> 
    <groupId>common.group.id</groupId> 
    <artifactId>Common</artifactId> 
    <version>1.0</version> 
    <classifier>tests</classifier> 
    <scope>test</scope> 
</dependency> 

नोट <classifier>tests</classifier>

+0

धन्यवाद - यह चाल है। लेकिन जो मैंने पढ़ा है - यह शायद अनुशंसित वास्तुकला नहीं हो सकता है - क्या यह सही है? क्या टॉमसज़ नर्कविचज़ (http://stackoverflow.com/a/11161411/357360) द्वारा प्रदान किया गया उत्तर एक मेवेन आर्किटेक्चर पीओवी से बेहतर है? – RonK

+0

@RonK। मैं कहूंगा, अगर संसाधन 'सामान्य/src/test' में' सामान्य 'में परीक्षण ऑब्जेक्ट बनाने के लिए पीछे के दरवाजे होते हैं, तो मेरे दृष्टिकोण का उपयोग करें। यदि कक्षाओं में सामान्य परीक्षण harnesses और ढांचे होते हैं तो Tomasz 'दृष्टिकोण का उपयोग करें। –

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