ग्रैडल का उपयोग करते समय मैं किस प्रकार एक संक्रामक निर्भरता के सभी उदाहरणों को बाहर करता हूं?


105

मेरी ढाल परियोजना applicationएक जार फ़ाइल बनाने के लिए प्लगइन का उपयोग करती है । रनटाइम सकर्मक निर्भरता के हिस्से के रूप में, मैं अंत में अंदर खींच रहा हूं org.slf4j:slf4j-log4j12। (यह कम से कम 5 या 6 अन्य सकर्मक निर्भरताओं में उप-पारगमन निर्भरता के रूप में संदर्भित है - यह परियोजना वसंत और हडूप का उपयोग कर रही है, इसलिए सब कुछ लेकिन रसोईघर सिंक में खींचा जा रहा है ... कोई प्रतीक्षा नहीं ... वह भी :) )।

मैं विश्व स्तर पर slf4j-log4j12जार को अपने निर्मित जार से बाहर करना चाहता हूं। तो मैंने यह कोशिश की है:

configurations {
  runtime.exclude group: "org.slf4j", name: "slf4j-log4j12"
}

हालाँकि, इसमें सभी org.slf4j कलाकृतियों को शामिल नहीं किया गया है slf4j-api। डिबग मोड के तहत चलने पर मुझे इस तरह की लाइनें दिखाई देती हैं:

org.slf4j#slf4j-api is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime).
org.slf4j#slf4j-simple is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime).
org.slf4j#slf4j-log4j12 is excluded from org.apache.hadoop:hadoop-common:2.2.0(runtime).

मैं नहीं चाहता कि प्रत्येक slf4j-log4j12सकर्मक निर्भरता के स्रोत को देखें और फिर compile foo { exclude slf4j... }मेरे dependenciesब्लॉक में अलग-अलग वक्तव्य हों ।

अपडेट करें:

मैंने भी यह कोशिश की:

configurations {
  runtime.exclude name: "slf4j-log4j12"
}

जो निर्माण से सब कुछ को छोड़कर समाप्त होता है ! जैसा कि मैंने निर्दिष्ट किया है group: "*"

अपडेट 2:

मैं इसके लिए ग्रैडल संस्करण 1.10 का उपयोग कर रहा हूं।


2
आप अपने सवालों के जवाब स्वीकार करना चाहते हैं; यह विनम्र है और आपके सवालों के जवाब देने में अधिक रुचि रखता है
माइकल डियरडफ

जवाबों:


139

आह, निम्नलिखित काम करता है और मुझे क्या चाहिए:

configurations {
  runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
}

ऐसा लगता है कि एक बहिष्कृत नियम में केवल दो विशेषताएँ हैं - groupऔर module। हालाँकि, उपर्युक्त वाक्यविन्यास आपको किसी भी मनमानी संपत्ति को विधेय के रूप में निर्दिष्ट करने से नहीं रोकता है। व्यक्तिगत निर्भरता से बाहर करने की कोशिश करते समय आप मनमाने गुणों को निर्दिष्ट नहीं कर सकते। उदाहरण के लिए, यह विफल रहता है:

dependencies {
  compile ('org.springframework.data:spring-data-hadoop-core:2.0.0.M4-hadoop22') {
    exclude group: "org.slf4j", name: "slf4j-log4j12"
  }
}

साथ में

No such property: name for class: org.gradle.api.internal.artifacts.DefaultExcludeRule

भले ही आप एक के साथ एक निर्भरता निर्दिष्ट कर सकते हैं group:और name:आप एक के साथ एक बहिष्करण निर्दिष्ट नहीं कर सकते हैं name:!

शायद एक अलग सवाल है, लेकिन क्या वास्तव में एक मॉड्यूल है ? मैं GroupId की Maven धारणा को समझ सकता हूं: विरूपण साक्ष्य: संस्करण, जिसे मैं समझता हूं कि समूह में अनुवाद: नाम: ग्रैडल में संस्करण। लेकिन फिर, मुझे कैसे पता चलेगा कि एक विशेष मावेन विरूपण साक्ष्य (ग्रेड-स्पीक में) क्या है?


1
यह ग्रेडल मंचों के लिए बेहतर चर्चा की तरह लगता है ।
सुपरएब


3
उह, मैं सिर्फ इस सटीक मुद्दे के साथ संघर्ष किया। मुझे ऐसा करना असाधारण रूप से मुश्किल लगता है, जो कि ग्रेडेल के साथ कुछ भी करना मुश्किल है, विशेष रूप से एक बड़ी परियोजना पर संघर्ष का समाधान। मैं ख़ुशी से
वर्ज़ाइल

"नाम:" होना चाहिए "मॉड्यूल:", तो यह u के लिए काम करेगा :)
लड़के

1
मुझे और अन्य लोगों के भविष्य के लाभ के लिए, मैं अपने युद्ध पैकेज से सभी निर्भरता पुस्तकालयों (ग्रेड 3.3) को बाहर करना चाहता था। इसलिए हर एक को सूचीबद्ध करने के बजाय, मैंने बस किया configurations { runtime.exclude group: '*' }
user1070304

39

वैश्विक रूप से एक या अधिक लाइब्रेरी को बाहर करने के लिए अपने build.gradle में निम्नलिखित जोड़ें

configurations.all {
   exclude group:"org.apache.geronimo.specs", module: "geronimo-servlet_2.5_spec"
   exclude group:"ch.qos.logback", module:"logback-core"
}

अब बहिष्कृत ब्लॉक में दो गुण समूह और मॉड्यूल हैं । आप में से मावन पृष्ठभूमि से आने वाले लोगों के लिए, समूह एक ही है जैसे कि GroupId और मॉड्यूल आर्टिफिशियलआईड के समान है । उदाहरण: com.mchange को बाहर करने के लिए: c3p0: 0.9.2.1 निम्नलिखित को ब्लॉक से बाहर रखा जाना चाहिए

exclude group:"com.mchange", module:"c3p0"

1
धन्यवाद मैं समझता हूं, उन्होंने कहा कि मॉड्यूल का नाम हो सकता है
रेमरियो

29

आपका दृष्टिकोण सही है। (परिस्थितियों के आधार पर, आप उपयोग करना चाह सकते हैं configurations.all { exclude ... }।) अगर ये वास्तव में एक ही निर्भरता से अधिक को बाहर करता है (मैंने कभी ध्यान नहीं दिया है कि उनका उपयोग करते समय), कृपया http://forums.gradle.org पर एक बग दर्ज करें , आदर्श रूप से एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के साथ।


1
configurations.all{}वास्तव में मैं क्या देख रहा था। पोस्ट के लिए धन्यवाद पीटर
pczeus

21

नीचे दिए गए उदाहरण में मैं बाहर करता हूं

वसंत-बूट स्टार्टर-बिल्ला

compile("org.springframework.boot:spring-boot-starter-web") {
     //by both name and group
     exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' 
}

5

मैं स्प्रिंग बूट 1.5.10 का उपयोग कर रहा था और लॉगबैक को बाहर करने की कोशिश करता था, ऊपर दिया गया समाधान अच्छी तरह से काम नहीं करता था, मैं इसके बजाय कॉन्फ़िगरेशन का उपयोग करता हूं

configurations.all {
    exclude group: "org.springframework.boot", module:"spring-boot-starter-logging"
}

3

@ बर्गुइगा-मोहम्मद-अमीन ने जो कहा, इसके अलावा, मैंने अभी पाया कि एक वाइल्डकार्ड को मॉड्यूल तर्क को खाली स्थान पर छोड़ने की आवश्यकता होती है:

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.