2016-06-27 23 views
5

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

- project/ 
    - common/ 
    - product-a/ 
    - product-b/ 

संबंध common, product-b के बीच product-a, और मुश्किल है:

मूल परियोजना इस लेआउट के लिए सेटअप किया गया था। common, product-a या product-b पर निर्भर करता है एक विन्यास फाइल के आधार पर। इसी तरह, product-a और product-bcommon पर निर्भर करते हैं, विन्यास संपत्ति की परवाह किए बिना। product-a और product-b कभी भी एक ही समय में नहीं बनाए जाएंगे।

मैंने सोचा था कि एक त्वरित समाधान project/build.gradle में कुछ इस तरह उपयोग करने के लिए होगा:

project(':product-a') { 
    dependencies { 
     compile project(':common') 
    } 
} 

project(':product-b') { 
    dependencies { 
     compile project(':common') 
    } 
} 

इसके बाद, मैं एक तरह से हो रही है यह सिर्फ product-a के लिए काम के साथ नज़दीकी बढ़ाने के बारे में सोचा। यही कारण है कि मुझे इस के लिए नेतृत्व किया:

project(':common') { 
    dependencies { 
     compile project(':product-a') 
    } 
} 

यह एक सर्कुलर निर्भरता होने के लिए एक अपवाद फेंक देते हैं।

मैं common और product-a/product-b द्वारा या बहुरूपता का उपयोग करके की उम्मीद वर्गों के इंटरफेस की स्थापना करके product-a और product-b पुनर्रचना पर विचार किया है, लेकिन इससे पहले कि मैं उन दोनों में से किसी के साथ आगे बढ़ने, वहाँ एक बेहतर तरीका है के साथ यह पूरा करने के लिए है Gradle? मैं अभी तक इस तकनीकी ऋण से छुटकारा पाने के लिए तैयार नहीं हूं।

उत्तर

5

एक परिपत्र निर्भरता को हटाने के लिए निर्माण चाल के साथ हल नहीं किया जा सकता है। आपको अपने मॉड्यूल को दोबारा बदलना होगा ताकि अब परिपत्र निर्भरता न हो। आपके मॉड्यूल नामों से, और कोई अन्य जानकारी के साथ, मुझे लगता है कि आप "सामान्य" के हिस्से को निकालना चाहते हैं जो "product- *" पर निर्भर करता है और इसे एक नए मॉड्यूल में डाल देता है।