ฉันจะยกเว้นอินสแตนซ์ทั้งหมดของการพึ่งพาสกรรมกริยาเมื่อใช้ Gradle ได้อย่างไร


108

โครงการ gradle ของฉันใช้applicationปลั๊กอินเพื่อสร้างไฟล์ jar ในฐานะส่วนหนึ่งของการขึ้นต่อกันของการส่งผ่านรันไทม์ฉันจึงดึงเข้าorg.slf4j:slf4j-log4j12มา (อ้างอิงว่าเป็น sub-transitive dependency อย่างน้อย 5 หรือ 6 การพึ่งพาสกรรมกริยาอื่น ๆ - โครงการนี้ใช้สปริงและ hadoop ดังนั้นทุกอย่างยกเว้นอ่างล้างจานจะถูกดึงเข้ามา ... ไม่ต้องรอ ... นั่นก็เช่นกัน :) ).

ฉันต้องการแยก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:

ฉันใช้ Gradle เวอร์ชัน 1.10 สำหรับสิ่งนี้


2
คุณอาจต้องการยอมรับคำตอบสำหรับคำถามของคุณ มันสุภาพและดึงดูดความสนใจในการตอบคำถามของคุณมากขึ้น
Michael Deardeuff

คำตอบ:


144

อ่าสิ่งต่อไปนี้ใช้ได้ผลและทำในสิ่งที่ฉันต้องการ:

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

ดังนั้นแม้ว่าคุณสามารถระบุการอ้างอิงด้วย a group:และname:คุณไม่สามารถระบุการยกเว้นด้วยไฟล์name: !?!

บางทีอาจจะเป็นคำถามที่แยกจากกัน แต่สิ่งที่ว่าเป็นโมดูลแล้ว? ฉันเข้าใจแนวคิด Maven ของ groupId: artifactId: version ซึ่งฉันเข้าใจว่าแปลเป็น group: name: version ใน Gradle แต่แล้วฉันจะรู้ได้อย่างไรว่าโมดูลใด (ใน gradle-speak) ที่เป็นของ Maven นั้นเป็นของ?


1
นี้ดูเหมือนว่าการอภิปรายที่ดีกว่าสำหรับฟอรั่ม Gradle
superEb

เสร็จแล้ว - forums.gradle.org/gradle/topics/…
Jens D

5
ฮึฉันเพิ่งต่อสู้กับปัญหานี้ ฉันพบว่ามันยากมากที่จะทำอะไรกับ gradle โดยเฉพาะอย่างยิ่งการแก้ปัญหาความขัดแย้งในโครงการขนาดใหญ่ ฉันใช้ xml แบบ verbose อย่างมีความสุขกับการตรวจสอบความถูกต้อง xsd มากกว่า dsl ของ
gradle

"ชื่อ:" ควรเป็น "โมดูล:" จากนั้นจะใช้งานได้สำหรับคุณ :)
GuyK

1
เพื่อประโยชน์ในอนาคตของฉันและคนอื่น ๆ ฉันต้องการแยกไลบรารีการพึ่งพาทั้งหมด (Gradle 3.3) ออกจากแพ็คเกจสงครามของฉัน ดังนั้นแทนที่จะทำรายการแต่ละรายการฉันก็ทำconfigurations { runtime.exclude group: '*' }ไป
user1070304

41

สำหรับการยกเว้นไลบรารีอย่างน้อยหนึ่งไลบรารีให้เพิ่มสิ่งต่อไปนี้ใน build.gradle ของคุณ

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

ตอนนี้ไม่รวมบล็อกมีคุณสมบัติสองกลุ่มและโมดูล สำหรับบรรดาของคุณมาจากพื้นหลัง Maven, กลุ่มเป็นเช่นเดียวกับgroupIDและโมดูลเป็นเช่นเดียวกับartifactId ตัวอย่าง: หากต้องการยกเว้น com.mchange: c3p0: 0.9.2.1 ต่อไปนี้ควรยกเว้นบล็อก

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

1
ขอบคุณฉันเข้าใจพวกเขาอาจบอกว่าโมดูลหมายถึงชื่อ
Remario

31

แนวทางของคุณถูกต้อง (คุณอาจต้องการใช้ทั้งนี้ขึ้นอยู่กับสถานการณ์configurations.all { exclude ... }) หากสิ่งเหล่านี้ไม่รวมการอ้างอิงมากกว่าหนึ่งรายการจริงๆ (ฉันไม่เคยสังเกตมาก่อนว่าเมื่อใช้พวกเขา) โปรดส่งข้อบกพร่องที่http://forums.gradle.orgโดยเป็นตัวอย่างที่สามารถทำซ้ำได้


2
configurations.all{}คือสิ่งที่ฉันกำลังมองหา ขอบคุณสำหรับโพสต์ Peter
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' 
}

6

ฉันใช้สปริงบูต 1.5.10 และพยายามที่จะยกเว้นการล็อกแบ็กวิธีแก้ปัญหาที่ระบุข้างต้นทำงานได้ไม่ดีฉันใช้การกำหนดค่าแทน

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

3

นอกเหนือจากสิ่งที่ @ berguiga-mohamed-amine ระบุไว้ฉันเพิ่งพบว่าตัวแทนต้องการปล่อยให้อาร์กิวเมนต์โมดูลเป็นสตริงว่าง:

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.