मल्टी-मॉड्यूल मावेन प्रोजेक्ट में मॉड्यूल के बीच src / परीक्षण कक्षाएं साझा करना


120

मेरे पास एक मल्टी-मॉड्यूल मावेन प्रोजेक्ट है। इस उदाहरण के लिए, दो मॉड्यूलों पर विचार करें:

  • data
  • consumer

मॉड्यूल consumerमें dataएक निर्भरता के रूप में मॉड्यूल है ।

मॉड्यूल dataकोर कक्षाओं का एक गुच्छा घोषित करता है। इसके तहत परीक्षण हैं src/testजो उनका उपयोग करते हैं। इन परीक्षणों के लिए कुछ लंबी-घुमावदार ऑब्जेक्ट निर्माण की आवश्यकता होती है, इसलिए मेरे पास इन वस्तुओं को बनाने के लिए इसमें कुछ उपयोगिता विधियों के साथ एक वर्ग है। यह उपयोगिता वर्ग ( SampleDataHelper) src/testपदानुक्रम में है।

मेरे पास consumerमॉड्यूल में कुछ परीक्षण भी हैं जिन्हें इन लंबी-घुमावदार वस्तुओं में से कुछ बनाने की आवश्यकता है। मैं अपने SampleDataHelperवर्ग का उपयोग (परिभाषित data src/test) उन परीक्षणों में करना चाहता हूं जो मेरे consumer src/testपेड़ में रहते हैं । दुर्भाग्य से, भले ही dataएक निर्भरता है consumer, consumerउन वर्गों को नहीं देख सकता है जो इसके अंतर्गत मौजूद हैं data src/test

इससे निपटने के लिए, मुझे लगा कि मैं एक और मॉड्यूल ( data-test) बना सकता हूं , और SampleDataHelperइसके तहत आगे बढ़ सकता हूं src/main। तो मैं data-testएक परीक्षण गुंजाइश निर्भरता के रूप में शामिल करेंगे data। दुर्भाग्य से, यह एक परिपत्र निर्भरता का परिचय देता है: dataउपयोग करता है data-test, लेकिन इसकी data-testआवश्यकता भी होती है data

एकमात्र समाधान जो मैं लेकर आया हूं, वह एक पैकेज SampleDataHelperके data src/mainतहत होना है testऔर आशा है कि कोई भी वास्तविक एप्लिकेशन कोड कभी भी इसे कॉल नहीं करेगा।

मैं इसे नीचे SampleDataHelperरखे बिना मॉड्यूल के बीच अपनी कक्षा कैसे साझा कर सकता हूं src/main?


1
की जाँच करें इस जवाब । मुझे लगता है कि यह आपकी मदद करनी चाहिए।
एंड्रयू लोगविनोव


@AndrewLogvinov: आपके लिंक किए गए उत्तर के लिए "दो-चरण" बनाने की आवश्यकता नहीं होगी? इससे पहले कि मैं अपना दूसरा मॉड्यूल संकलित कर सकूं, पहले एक मॉड्यूल ( ) बनाने और तैनातdata करने के लिए consumer
ग्रेग कोफ

मुझे लगता है कि आप हो सकता है कुछ समस्याओं के पार चलो अगर आप का उपयोग करें mvn package, लेकिन यह एक ही चरण निर्माण में ठीक काम करना चाहिए जब आप का उपयोग करें mvn installया mvn deploy। बस एक त्वरित नोट। हमारी एक बड़ी परियोजना में हमारे पास जूनियर के ऊपर एक रैपर है TestBaseऔर यह स्थित है src/mainजिसमें मैं या तो एक अच्छा विचार नहीं मानता हूं।
एंड्रयू लोगविनोव

जवाबों:


152

आपका उपभोक्ता प्रोजेक्ट आपके डेटा प्रोजेक्ट पर निर्भर करता है, इसलिए हम खुश हैं कि डेटा को उपभोक्ता से पहले बनाया जाना चाहिए। परिणामस्वरूप, टिप्पणियों में सुझाई गई तकनीकों का उपयोग करते हुए , मैं यह सुनिश्चित करूंगा कि आपके डेटा प्रोजेक्ट में सभी परीक्षण कोड शामिल हैं जिन्हें आप परीक्षण JAR का उत्पादन करने के लिए POM को साझा और कॉन्फ़िगर करना चाहते हैं:

<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>

आपका उपभोक्ता प्रोजेक्ट तब सामान्य डेटा JAR विरूपण साक्ष्य और अतिरिक्त test-jarकलाकृतियों दोनों पर निर्भर करेगा , जिसमें निश्चित रूप से परीक्षण गुंजाइश होगी:

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>data</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

मैंने कई अवसरों पर इस दृष्टिकोण का उपयोग किया है और यह अच्छी तरह से काम करता है।


1
"जब आपका उपभोक्ता प्रोजेक्ट सामान्य डेटा JAR विरूपण साक्ष्य, और अतिरिक्त परीक्षण-जार विरूपण साक्ष्य" दोनों भाग पर निर्भर करेगा, जब मैं उपभोक्ता में डेटा की निर्भरता दोनों जोड़ दूंगा (मान लीजिए कि मेरी कलाकृतियों को डेटा और उपभोक्ता के रूप में अच्छी तरह से कहा जाता है) pom, विशिष्ट संस्करणों के विनिर्देश के बिना, पोम को त्रुटि मिली। ऐसा क्यों होता है?
जॉनी

@StasS शायद सबसे अच्छा है कि आप उसके बारे में एक अलग प्रश्न खोलें।
डंकन जोन्स


1

तो समस्या यह है कि dataमॉड्यूल में (कुछ) परीक्षण SampleDataHelperकक्षा पर निर्भर करते हैं ? आप ले जा सकते हैं SampleDataHelperकरने के लिए वर्ग src/mainके data-testमॉड्यूल, यदि आप एक ही समय में करने के लिए परीक्षण (कि विशिष्ट वर्ग पर निर्भर करते हैं) को स्थानांतरित src/testकी data-testमॉड्यूल। नतीजतन, अधिक परिपत्र निर्भरता नहीं होगी।


1
अगर मैं आपको समझता हूं, तो आप सुझाव दे रहे हैं कि किसी भी परीक्षण का उपयोग करें SampleDataHelperजो dataमॉड्यूल या consumerमॉड्यूल (उपयुक्त के रूप में) से ले जाए data-test। दुर्भाग्य से मुझे यह बहुत "साफ-सुथरा" समाधान नहीं लगता क्योंकि यह मेरे परीक्षणों को उन मॉड्यूल से बाहर ले जाता है जो वे परीक्षण करते हैं, और एक अलग तरीके से। (सख्ती से बोलते हुए, आपने केवल dataपरीक्षण को स्थानांतरित करने के लिए कहा था , लेकिन मुझे लगता है कि मैं खुद को स्थिरता के लिए आगे बढ़ रहा हूं)। लेकिन आपके जवाब के लिए धन्यवाद। :-)
ग्रेग कोफ़्फ़

1
हां, आपने मुझे सही तरीके से समझा। और यकीनन, यह एक साफ सुथरे की तुलना में जल्दी समाधान है। :-)
मटसेव

मुझे लगता है कि परिपत्र निर्भरता बनी रहेगी। यह मानते हुए कि परीक्षण में परीक्षण डेटा परियोजना में परिभाषित वर्गों का उपयोग करते हैं, फिर भी डेटा-टेस्ट प्रोजेक्ट से डेटा प्रोजेक्ट पर वापस संदर्भ होना चाहिए।
डंकन जोन्स

1
@DuncanJones क्षमा करें, मेरी पोस्ट में एक छोटा टाइपो था। मैं जिस बिंदु को बनाने की कोशिश कर रहा हूं वह यह है कि data-testमॉड्यूल मॉड्यूल पर निर्भर होना चाहिए data(और चारों ओर अन्य तरीके से नहीं)। परिपत्र निर्भरता से बचने के लिए, सभी परीक्षण जो वर्तमान में उस dataमॉड्यूल में रहते हैं जो मॉड्यूल का उपयोग SampleDataHelperकरना चाहिए data-test
मटकाव

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