Làm cách nào để loại trừ tất cả các trường hợp phụ thuộc bắc cầu khi sử dụng Gradle?


104

Dự án gradle của tôi sử dụng applicationplugin để tạo tệp jar. Là một phần của phụ thuộc bắc cầu thời gian chạy, tôi kết thúc việc kéo vào org.slf4j:slf4j-log4j12. (Nó được tham chiếu như một phụ thuộc bắc cầu phụ trong ít nhất 5 hoặc 6 phụ thuộc bắc cầu khác - dự án này đang sử dụng spring và hadoop, vì vậy mọi thứ ngoại trừ bồn rửa nhà bếp đang được kéo vào ... không chờ đợi ... đó cũng vậy :) ).

Tôi muốn loại trừ slf4j-log4j12bình trên toàn cầu khỏi bình đã xây dựng của mình. Vì vậy, tôi đã thử điều này:

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

Tuy nhiên, điều này dường như loại trừ tất cả các org.slf4j hiện vật bao gồm slf4j-api. Khi chạy ở chế độ gỡ lỗi, tôi thấy các dòng như:

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).

Tôi không muốn phải tra cứu nguồn của từng slf4j-log4j12phụ thuộc bắc cầu và sau đó có các compile foo { exclude slf4j... }câu lệnh riêng lẻ trong dependencieskhối của mình .

Cập nhật:

Tôi cũng đã thử điều này:

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

Cuối cùng thì loại trừ mọi thứ khỏi bản dựng! Như thể tôi đã chỉ định group: "*".

Cập nhật 2:

Tôi đang sử dụng phiên bản Gradle 1.10 cho việc này.


2
bạn có thể muốn chấp nhận câu trả lời cho câu hỏi của mình; đó là lịch sự và thu hút được sự quan tâm nhiều hơn trong việc trả lời câu hỏi của bạn
Michael Deardeuff

Câu trả lời:


136

Ah, những điều sau đây hoạt động và thực hiện những gì tôi muốn:

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

Có vẻ như Quy tắc loại trừ chỉ có hai thuộc tính - groupmodule. Tuy nhiên, cú pháp trên không ngăn bạn chỉ định bất kỳ thuộc tính tùy ý nào làm vị ngữ. Khi cố gắng loại trừ khỏi một phụ thuộc riêng lẻ, bạn không thể chỉ định các thuộc tính tùy ý. Ví dụ, điều này không thành công:

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

với

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

Vì vậy, mặc dù bạn có thể chỉ định một phụ thuộc với a group:name:bạn không thể chỉ định một loại trừ với a name:!?!

Có lẽ một câu hỏi riêng biệt, nhưng chính xác thì một mô-đun là gì? Tôi có thể hiểu khái niệm Maven về groupId: craftId: version, mà tôi hiểu được dịch thành group: name: version trong Gradle. Nhưng sau đó, làm thế nào để tôi biết mô-đun (trong gradle-speak) một hiện vật Maven cụ thể thuộc về mô-đun nào?


1
Đây có vẻ là cuộc thảo luận tốt hơn cho các diễn đàn Gradle .
tuyệt vời


3
Rất tiếc, tôi vừa phải vật lộn với vấn đề chính xác này. Tôi thấy rất khó để làm bất cứ điều gì với gradle, đặc biệt là giải quyết xung đột trong một dự án lớn. Tôi hạnh phúc muốn mất verbose xml với XSD xác nhận qua gradle của dsl
cjbooms

"Tên:" phải là "mô-đun:", thì nó sẽ hoạt động cho bạn :)
GuyK

1
Vì lợi ích của tương lai tôi và những người khác, tôi muốn loại trừ TẤT CẢ các thư viện phụ thuộc (Gradle 3.3) khỏi gói chiến tranh của mình. Vì vậy, thay vì liệt kê ra từng thứ, tôi chỉ đơn giản là làm configurations { runtime.exclude group: '*' }.
user1070304 Ngày

39

Để loại trừ một hoặc nhiều thư viện trên toàn cầu, hãy thêm phần sau vào build.gradle của bạn

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

Bây giờ khối loại trừ có hai nhóm thuộc tính và mô-đun . Đối với những người bạn đến từ nền tảng maven, nhóm giống như groupIdmô-đun giống như ArtifactId . Ví dụ: Để loại trừ com.mchange: c3p0: 0.9.2.1 sau đây nên được loại trừ khối

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

1
cảm ơn tôi hiểu, họ có thể đã nói mô-đun có nghĩa là tên
Remario

29

Cách tiếp cận của bạn là đúng. (Tùy thuộc vào trường hợp, bạn có thể muốn sử dụng configurations.all { exclude ... }.) Nếu những loại trừ này thực sự loại trừ nhiều hơn một phụ thuộc duy nhất (tôi chưa từng nhận thấy điều đó khi sử dụng chúng), vui lòng gửi lỗi tại http://forums.gradle.org , lý tưởng nhất là với một ví dụ có thể tái tạo.


1
configurations.all{}chính xác là những gì tôi đang tìm kiếm. Cảm ơn vì bài viết Peter
pczeus

20

trong ví dụ dưới đây tôi loại trừ

spring-boot-starter-tomcat

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

5

Tôi đang sử dụng spring boot 1.5.10 và cố gắng loại trừ đăng nhập lại, giải pháp đưa ra ở trên không hoạt động tốt, tôi sử dụng cấu hình thay thế

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

3

Ngoài những gì @ berguiga-mohamed-amine đã nêu, tôi chỉ thấy rằng một ký tự đại diện yêu cầu để lại đối số mô-đun là chuỗi trống:

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.