2012-03-29 19 views
17

Gradle 1.0 उपयोग करने के लिए नहीं मील का पत्थर 8.Gradle - एक विन्यास के लिए एक निर्भरता बाहर करते हैं, लेकिन एक विरासत विन्यास

मेरे परियोजना slf4j + Logback प्रवेश के लिए उपयोग करता है, तो मैं प्रदूषण से log4j पर किसी भी सकर्मक deps रोकना चाहते हैं, मेरी classpath। इस प्रकार, मैं एक वैश्विक बहिष्कार, इसलिए की तरह कहा:

configurations { 
    all*.exclude group: "log4j", module: "log4j" 
} 

हालांकि, मैं एक परीक्षण पुस्तकालय (hadoop-minicluster) जो log4j पर एक क्रम निर्भरता है का उपयोग कर रहा है, इसलिए मैं अब अपने परीक्षण क्रम के लिए एक log4j निर्भरता की अनुमति देनी होगी । मैं log4j पर सीधा निर्भरता को जोड़ने की कोशिश की:

testRuntime group: "log4j", name: "log4j", version: "1.2.15" 

और संपादन मेरी बहिष्कार कोड (एक हैक का एक सा):

configurations.findAll {!it.name.endsWith('testRuntime')}.each { conf -> 
    conf.exclude group: "log4j", module: "log4j" 
} 

लेकिन यह काम नहीं करता। TestCompile conf को बहिष्करण जोड़ना स्वचालित रूप से सभी विरासत कॉन्फ़िगरेशन में भी जोड़ता है, जिसमें testRuntime भी शामिल है। और ऐसा लगता है कि यह बहिष्कार मैंने जो स्पष्ट निर्भरता भी जोड़ा है, उसे ओवरराइड करता है।

ऐसा प्रतीत होता है कि यह ग्रैडल के लिए व्यवहार की अपेक्षा की जाती है। the docs से:

आप एक एक विशेष विन्यास के लिए बाहर निकालने के निर्धारित करते हैं बाहर रखा गया सकर्मक निर्भरता जब इस विन्यास या किसी इनहेरिट विन्यास को हल करने के लिए सभी निर्भरता फ़िल्टर कर दिया जाएगा।

तो क्या मैं ऐसा करना चाहता हूं जो मैं प्राप्त करना चाहता हूं?

विचार:

  • एक नया conf myTestRuntime कि testCompile से विस्तार नहीं करता है बनाएँ, और का उपयोग करें कि अपने परीक्षण classpath के लिए।
    • लेकिन फिर मुझे testCompile और myTestRuntime दोनों के लिए सभी निर्भरताओं को डुप्लिकेट करना होगा।
  • कॉन्फ़िगरेशन-स्तर बहिष्करण निकालें। TestRuntime के अलावा सभी confs के लिए, निर्भरताओं के माध्यम से पाश और log4j मैन्युअल रूप से हटा दें (या log4j पर एक डिप्टी-स्तर बहिष्करण जोड़ें)।
    • क्या यह भी संभव है? कॉन्फ़िगरेशन। सभी निर्भरता केवल पढ़ने के लिए है।

उत्तर

8

अभी के लिए मैं समस्या को हल करने में कामयाब रहे, लेकिन मैं अभी भी किसी भी बेहतर समाधान स्वागत करते हैं।

log4j(group: 'log4j', name: 'log4j', version: '1.2.15') { 
    transitive = false 
} 
  • है कि एक से अलग सभी विन्यास के लिए config स्तर के बहिष्कार छोड़ दो:

    • सिर्फ log4j के लिए एक नया विन्यास करें:

      यहाँ मैं क्या कर समाप्त हो गया है

      configurations.findAll {!it.name.endsWith('log4j')}.each { conf -> 
          conf.exclude group: "log4j", module: "log4j" 
      } 
      
    • लॉग 4j कॉन्फ़िगरेशन मेरे परीक्षणों में क्लासपा जोड़ें वें:

      test { 
          classpath += configurations.log4j 
      } 
      

    इस तरह हम classpath पर log4j.jar प्राप्त कर सकते हैं, भले ही यह testRuntime विन्यास से बाहर रखा गया है।

  • +2

    क्या आप अपना वैश्विक बहिष्कार नहीं कर सकते थे और फिर 'log4j-over-slf4j.jar'' जोड़ सकते हैं? http://www.slf4j.org/legacy.html – Snekse

    +0

    @ स्नेक्से जो भी काम करेगा। अच्छा विचार –

    2

    आपको बहिष्करण को परिभाषित करने की आवश्यकता नहीं है। जब तक आप कुछ पुन: कॉन्फ़िगर नहीं करते हैं, तब तक एक प्रोजेक्ट की testRuntime कॉन्फ़िगरेशन का उपयोग केवल उस प्रोजेक्ट के test कार्य के लिए किया जाएगा।

    +1

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

    4

    यहां तक ​​कि मुझे इसी तरह की स्थिति का सामना करना पड़ा जहां मुझे वसा जार समेत स्पार्क जार को बाहर करने की आवश्यकता है लेकिन परीक्षण के मामलों में स्पार्क जार निष्पादित करने की आवश्यकता होती है। इसलिए नीचे कॉन्फ़िगरेशन मेरे लिए काम करता है। तो मूल रूप से मैं कक्षापथ परीक्षण करने के लिए संकलन समय निर्भरता जोड़ रहा हूँ। इसलिए समाधान के नीचे आपकी समस्या के लिए

    configurations{ 
        runtime.exclude group: 'log4j' 
    } 
    
    test { 
         classpath += configurations.compile 
    } 
    
    संबंधित मुद्दे