gradle - 如何从 build.gradle 中包含的外部 jar 的传递依赖中排除包?

标签 gradle build.gradle

我在 build.gradle 中包含了以下依赖项:

testCompile group: 'com.xebialabs.restito', name: 'restito', version:'0.5.1'

但是有了这个 jar,其他依赖项,如 jersey-core-1.18.3.jar 也被包含在内。

现在我想要这个 Jersey jar,但它也有一个包 javax.ws.rs.core,其中包含与我在 build.gradle 中明确包含的最新版本的 javax.ws.rs.core 冲突的类。

有什么方法可以只从传递依赖项中排除特定包,而不是整个依赖项。我是一个新手,所以如果使用了任何不正确的术语,请纠正我。

当我运行以下命令时:
gradlew dependencies --configuration testCompile

它给了我以下依赖树。此处仅显示相关部分
testCompile - Compile classpath for source set 'test'.

+--- org.apache.cxf:cxf-rt-frontend-jaxrs:3.0.3
|    +--- org.apache.cxf:cxf-core:3.0.3 (*)
|    +--- javax.ws.rs:javax.ws.rs-api:2.0.1
|    +--- javax.annotation:javax.annotation-api:1.2
|    \--- org.apache.cxf:cxf-rt-transports-http:3.0.3 (*)
+--- org.apache.cxf:cxf-rt-rs-service-description:3.0.0-milestone1
|    \--- org.apache.cxf:cxf-rt-frontend-jaxrs:3.0.0-milestone1 -> 3.0.3 (*)
+--- org.codehaus.jackson:jackson-jaxrs:1.9.13
|    +--- org.codehaus.jackson:jackson-core-asl:1.9.13
|    \--- org.codehaus.jackson:jackson-mapper-asl:1.9.13
|         \--- org.codehaus.jackson:jackson-core-asl:1.9.13
+--- org.codehaus.jackson:jackson-mapper-asl:1.9.12 -> 1.9.13 (*)
+--- com.fasterxml.jackson.core:jackson-databind:2.4.1.2
|    +--- com.fasterxml.jackson.core:jackson-annotations:2.4.0
|    \--- com.fasterxml.jackson.core:jackson-core:2.4.1.1
\--- com.xebialabs.restito:restito:0.5.1
     +--- org.slf4j:slf4j-api:1.7.5 -> 1.7.7
     +--- org.mockito:mockito-core:1.10.17
     |    +--- org.hamcrest:hamcrest-core:1.1 -> 1.3
     |    \--- org.objenesis:objenesis:2.1
     +--- org.apache.mina:mina-core:2.0.4
     |    \--- org.slf4j:slf4j-api:1.6.1 -> 1.7.7
     +--- org.glassfish.grizzly:grizzly-http-server:2.3.17
     |    \--- org.glassfish.grizzly:grizzly-http:2.3.17
     |         \--- org.glassfish.grizzly:grizzly-framework:2.3.17
     +--- junit:junit:4.12
     |    \--- org.hamcrest:hamcrest-core:1.3
     \--- com.sun.jersey:jersey-grizzly2:1.18.3
          +--- org.glassfish.grizzly:grizzly-http:2.2.16 -> 2.3.17 (*)
          +--- org.glassfish.grizzly:grizzly-http-server:2.2.16 -> 2.3.17 (*)
          \--- com.sun.jersey:jersey-server:1.18.3
               \--- com.sun.jersey:jersey-core:1.18.3

(*) - dependencies omitted (listed previously)

现在上课Responsejavax.ws.rs:javax.ws.rs-api:2.0.1在包裹下javax.ws.rs.core .同样还有一个Response类(class)出现在 com.sun.jersey:jersey-core:1.18.3包装内javax.ws.rs.core .但是后一个包含没有 readEntity() 的早期版本rs-api 2.0 中引入的方法。 Response 的依赖关系在我的项目中总是被解析为早期版本。

最佳答案

引用 gradle 用户指南部分关于 Excluding transitive dependencies :

You can exclude a transitive dependency either by configuration or by dependency:

Example 50.14

configurations {
    compile.exclude module: 'commons'
    all*.exclude group: 'org.gradle.test.excludes', module: 'reports'
}

dependencies {
    compile("org.gradle.test.excludes:api:1.0") {
    exclude module: 'shared'
    }
}


因此,回到您的情况,您可以简单地采用上述方法之一,并将示例中的模块替换为您要排除的模块,例如
configurations {
    testCompile.exclude group: 'javax.ws.rs', module: 'jsr311-api'
}

更新 (根据提供的其他详细信息)

您需要做的是将以下几行添加到您的脚本中
configurations {
  testCompile.exclude group: 'com.sun.jersey', module: 'jersey-core'
}

考虑以下最小 build.gradle脚本:

应用插件:'java'
repositories {
    mavenCentral()
}

configurations {
  // Excluding com.sun.jersey:jersey-core:1.18.3, option #1: 
  // compile.exclude group: 'com.sun.jersey', module: 'jersey-core'
}

dependencies {
    compile "org.apache.cxf:cxf-rt-frontend-jaxrs:3.0.3"
    compile ("com.sun.jersey:jersey-grizzly2:1.18.3") {
      // Excluding com.sun.jersey:jersey-core:1.18.3, option #2: 
      // exclude group: 'com.sun.jersey', module: 'jersey-core'
    }
}

现在,上面的文件正在运行 gradlew dependencies --configuration testCompile你会得到下一个依赖树:
+--- org.apache.cxf:cxf-rt-frontend-jaxrs:3.0.3
|    +--- org.apache.cxf:cxf-core:3.0.3
|    |    +--- org.codehaus.woodstox:woodstox-core-asl:4.4.1
|    |    |    \--- org.codehaus.woodstox:stax2-api:3.1.4
|    |    \--- org.apache.ws.xmlschema:xmlschema-core:2.1.0
|    +--- javax.ws.rs:javax.ws.rs-api:2.0.1
|    +--- javax.annotation:javax.annotation-api:1.2
|    \--- org.apache.cxf:cxf-rt-transports-http:3.0.3
|         \--- org.apache.cxf:cxf-core:3.0.3 (*)
\--- com.sun.jersey:jersey-grizzly2:1.18.3
     +--- org.glassfish.grizzly:grizzly-http:2.2.16
     |    \--- org.glassfish.grizzly:grizzly-framework:2.2.16
     +--- org.glassfish.grizzly:grizzly-http-server:2.2.16
     |    +--- org.glassfish.grizzly:grizzly-http:2.2.16 (*)
     |    \--- org.glassfish.grizzly:grizzly-rcm:2.2.16
     |         \--- org.glassfish.grizzly:grizzly-framework:2.2.16
     \--- com.sun.jersey:jersey-server:1.18.3
          \--- com.sun.jersey:jersey-core:1.18.3

请注意 com.sun.jersey:jersey-core:1.18.3被列为传递依赖。现在,取消注释任何一个排除选项并重新运行相同的命令,您将获得以下包含此模块的输出:
+--- org.apache.cxf:cxf-rt-frontend-jaxrs:3.0.3
|    +--- org.apache.cxf:cxf-core:3.0.3
|    |    +--- org.codehaus.woodstox:woodstox-core-asl:4.4.1
|    |    |    \--- org.codehaus.woodstox:stax2-api:3.1.4
|    |    \--- org.apache.ws.xmlschema:xmlschema-core:2.1.0
|    +--- javax.ws.rs:javax.ws.rs-api:2.0.1
|    +--- javax.annotation:javax.annotation-api:1.2
|    \--- org.apache.cxf:cxf-rt-transports-http:3.0.3
|         \--- org.apache.cxf:cxf-core:3.0.3 (*)
\--- com.sun.jersey:jersey-grizzly2:1.18.3
     +--- org.glassfish.grizzly:grizzly-http:2.2.16
     |    \--- org.glassfish.grizzly:grizzly-framework:2.2.16
     +--- org.glassfish.grizzly:grizzly-http-server:2.2.16
     |    +--- org.glassfish.grizzly:grizzly-http:2.2.16 (*)
     |    \--- org.glassfish.grizzly:grizzly-rcm:2.2.16
     |         \--- org.glassfish.grizzly:grizzly-framework:2.2.16
     \--- com.sun.jersey:jersey-server:1.18.3

关于gradle - 如何从 build.gradle 中包含的外部 jar 的传递依赖中排除包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30237435/

相关文章:

android - Gradle 错误 : No value has been specified for property 'buildConfigPackageName'

android - 如何在 Android 上解析 "Failed resolution of: Lcom/sun/mail/util/MailLogger"?

android - 不包含库.jar中的软件包

gradle - 如何在build.gradle中定义和调用自定义方法?

gradle - 如何使用Jacoco仅在Gradle项目中获取特定类的代码覆盖率

java - Gradle 不刷新 Idea 项目中的依赖项

android - 使用 gradle 为构建变体创建 Activity 别名

testing - 如何在 doFirst/doLast 闭包中执行内置的 gradle 任务?

grails - 从 Grails 3 中的 WAR 打包中排除文件/目录

firebase - 在1m 9s内构建失败,并完成以下错误:Gradle任务assembleDebug失败,退出代码为1