我们正在使用gradle运行一个spring-boot应用程序。
为了包含spring-boot插件,我们将其添加为依赖项:
buildscript {
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.2.RELEASE")
}
}
不幸的是,这个插件附带了依赖
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'
}
}
哪个不起作用。
还添加:
configurations {
classpath.exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl'
}
没有任何效果。
欢迎任何提示。
答案 0 :(得分:7)
如果您要排除
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', module: 'log4j-slf4j-impl'
}
}
答案 1 :(得分:3)
当我想确保依赖项永远不会添加到项目中时,我通常会回退到这一点。
configurations {
all*.exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl', version '2.4.1'
}
但是你确定你需要排除依赖。它不应该是构建jar / war的一部分。 您可以使用“gradlew dependencies”检查所有依赖项。
答案 2 :(得分:2)
两个步骤,追逐传递依赖关系,然后将其从负责的库中排除。
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
现在,一旦你知道从哪里排除依赖,就像之前一样去除它。您可以再次运行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'
}
}
另一种解决方案可能是覆盖依赖项解析程序并强制将版本强制为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'
}
}
}
我的意见是,我可能不想一直在resolutionStrategy
添加支票,所以最好在dependencyInsights
中跟踪它。这也意味着在两个地方更新版本,如果另一个开发人员不知道gradle的resolutionStrategy
是如何工作的,那么他们将会感到很奇怪"行为......例如。我将log4j
更新为2.7
,但它仍然使用2.5
构建?!?!
但两者都是有效的方法
答案 3 :(得分:0)
不知何故问题是我将log4j声明为运行时依赖:
thread apply all bt
这导致版本2.4.1被某些编辑器魔法提取为编译依赖。
因此我在类路径上有2.4.1和2.5。
一旦我将log4j声明为编译依赖性2.4.1就消失了......