在gradle中删除传递类路径依赖项

que*_*ire 9 java dependency-management gradle spring-boot

我们正在用gradle运行一个spring-boot应用程序.

为了包含spring-boot插件,我们将其添加为依赖项:

buildscript {
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.2.RELEASE") 
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个插件附带了依赖 org.apache.logging.log4j:log4j-slf4j-impl:2.4.1

我想排除.

已经尝试过添加:

  dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.2.RELEASE") {
            exclude group: 'org.apache.logging.log4j'
        }
    }
Run Code Online (Sandbox Code Playgroud)

哪个不起作用.

还添加:

configurations {
    classpath.exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl'
}
Run Code Online (Sandbox Code Playgroud)

没有任何影响.

任何提示都是受欢迎的.

RaG*_*aGe 7

如果你想排除

org.apache.logging.log4j:log4j-slf4j-impl:2.4.1
Run Code Online (Sandbox Code Playgroud)

尝试

dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.2.RELEASE") {
        exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl'
    }
}
Run Code Online (Sandbox Code Playgroud)


ssi*_*lar 5

当我想确保依赖项从未添加到项目中时,我通常会回退到此。

configurations {
    all*.exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl', version '2.4.1'
}
Run Code Online (Sandbox Code Playgroud)

但您确定需要排除依赖性吗?它不应该是构建 jar/war 的一部分。您可以使用“gradlew依赖项”检查所有依赖项。


JBi*_*gas 5

两个步骤,追踪传递依赖,然后将其从负责的库中排除。

gradle dependencies为您提供包括传递性在内的完整列表。如果您的项目很小,这可能会有所帮助,但对于大型企业构建……它的信息太多了。随意搜索它,但我们从dependencyInsight.

gradle dependencyInsight --dependency someDependency找到依赖项可能进入构建的所有位置。如果您有多个版本,这将有助于明确版本的来源。

在我的用例中,日志显式声明为编译时依赖项,因此如下所示。如果log4j在其他任何地方,您会看到有问题的库以及 v 的编译时声明2.5

我必须在每个子模块上显式运行它。

$ gradle util:dependencyInsight --dependency org.apache.logging.log4j
Configuration on demand is an incubating feature.
:util:dependencyInsight
org.apache.logging.log4j:log4j-api:2.5
+--- compile
\--- org.apache.logging.log4j:log4j-core:2.5
     \--- compile

org.apache.logging.log4j:log4j-core:2.5
\--- compile

(*) - dependencies omitted (listed previously)

BUILD SUCCESSFUL

Total time: 0.933 secs
Run Code Online (Sandbox Code Playgroud)

现在,一旦您知道从哪里排除依赖项,就可以像以前一样删除它。您可以通过dependencyInsights再次运行来确认

dependencies {
    // found through `gradle dependencyInsight --dependency org.apache.logging.log4j`
    classpath("someOtherGroup:someOtherArtifactId:1.0") {
        exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl'
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种解决方案可能是覆盖依赖解析器并强制版本 2.5

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.group == "org.apache.logging.log4j") {
            println "Updating version for: $details.requested.group:$details.requested.name:$details.requested.version --> 2.5"
            details.useVersion '2.5'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的意见是,我可能不想一直添加检查,resolutionStrategy所以最好在dependencyInsights. 这也意味着在两个地方更新版本,如果另一个开发人员不知道 gradle 是如何resolutionStrategy工作的,那么他们将有“奇怪”的行为......例如。我更新log4j为,2.7但它仍然使用2.5?!?!

但两者都是有效的方法


que*_*ire 0

不知何故,问题是我将 log4j 声明为运行时依赖项:

  ext {
       log4jVersion="2.5"
  }
  runtime (
            "org.apache.logging.log4j:log4j-slf4j-impl:$log4jVersion",
            "org.apache.logging.log4j:log4j-api:$log4jVersion",
            "org.apache.logging.log4j:log4j-core:$log4jVersion"
        )
Run Code Online (Sandbox Code Playgroud)

这导致版本 2.4.1 被某些编辑器魔法获取为编译依赖项。

因此,我的类路径上有 2.4.1 和 2.5。

一旦我将 log4j 声明为编译依赖项 2.4.1 就消失了......