java - Gradle का उपयोग करते समय मैं एक ट्रांजिटिव निर्भरता के सभी उदाहरणों को कैसे बाहर निकालूं?




(4)

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

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

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

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

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 संक्रमणीय निर्भरता के स्रोत को देखना नहीं चाहता हूं और फिर मेरे dependencies ब्लॉक में व्यक्तिगत compile foo { exclude slf4j... } कथन compile foo { exclude slf4j... }

अद्यतन करें:

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

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

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

अद्यतन 2:

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


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


आह, निम्नलिखित काम करता है और जो मैं चाहता हूं वह करता है:

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: साथ निर्भरता निर्दिष्ट कर सकें group: और name: आप किसी name: साथ बहिष्करण निर्दिष्ट नहीं कर सकते name: !?

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


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

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

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

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

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

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




gradle