java 在Gradle中从Sping Boot 中排除Tomcat依赖项

bvk5enib  于 2022-11-27  发布在  Java
关注(0)|答案(6)|浏览(250)

我将Sping Boot 与Jetty一起使用,似乎无法在Gradle构建文件中排除所有Tomcat依赖项。
构建gradle的相关部分:

compile("org.springframework.boot:spring-boot-starter") {
    exclude module: "tomcat-embed-el"
}
compile("org.springframework.boot:spring-boot-starter-jetty")

compile("org.springframework.boot:spring-boot-starter-web") {
    exclude module: "spring-boot-starter-tomcat"
}

然而,当我运行gradle dependencies时,tomcat的某些部分仍然存在,并导致WebSockets出现问题:

...
|    
+--- org.springframework.boot:spring-boot-starter-web: -> 1.4.1.RELEASE
|    +--- org.springframework.boot:spring-boot-starter:1.4.1.RELEASE (*)
|    +--- org.hibernate:hibernate-validator:5.2.4.Final
|    |    +--- javax.validation:validation-api:1.1.0.Final
|    |    +--- org.jboss.logging:jboss-logging:3.2.1.Final -> 3.3.0.Final
|    |    \--- com.fasterxml:classmate:1.1.0 -> 1.3.1
|    +--- com.fasterxml.jackson.core:jackson-databind:2.8.3
|    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.8.0 -> 2.8.3
|    |    \--- com.fasterxml.jackson.core:jackson-core:2.8.3
|    +--- org.springframework:spring-web:4.3.3.RELEASE
|    |    +--- org.springframework:spring-aop:4.3.3.RELEASE (*)
|    |    +--- org.springframework:spring-beans:4.3.3.RELEASE (*)
|    |    +--- org.springframework:spring-context:4.3.3.RELEASE (*)
|    |    \--- org.springframework:spring-core:4.3.3.RELEASE
|    +--- org.springframework:spring-webmvc:4.3.3.RELEASE
|    |    +--- org.springframework:spring-aop:4.3.3.RELEASE (*)
|    |    +--- org.springframework:spring-beans:4.3.3.RELEASE (*)
|    |    +--- org.springframework:spring-context:4.3.3.RELEASE (*)
|    |    +--- org.springframework:spring-core:4.3.3.RELEASE
|    |    +--- org.springframework:spring-expression:4.3.3.RELEASE (*)
|    |    \--- org.springframework:spring-web:4.3.3.RELEASE (*)
|    \--- org.springframework.boot:spring-boot-starter-tomcat:1.4.1.RELEASE
|         +--- org.apache.tomcat.embed:tomcat-embed-core:8.5.5
|         +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.5
|         \--- org.apache.tomcat.embed:tomcat-embed-websocket:8.5.5
|              \--- org.apache.tomcat.embed:tomcat-embed-core:8.5.5
...

为什么spring-boot-starter-tomcat不排除在spring-boot-starter-web之外?

u5i3ibmn

u5i3ibmn1#

啊哈,找到原因了。
我还有compile("org.springframework.boot:spring-boot-starter-websocket")依赖项,它也依赖于spring-boot-starter-tomcat。Gradle依赖项输出误导我认为spring-boot-starter-web是Tomcat仍然存在的原因。
我不得不补充以下内容:

compile("org.springframework.boot:spring-boot-starter-websocket") {
    exclude module: "spring-boot-starter-tomcat"
}

经验教训是,当您想要排除某个依赖项时,请仔细检查所有依赖项,以确保它被排除在所有位置之外。而且,Gradle依赖项输出可以进行改进,以减少误导性。

gk7wooem

gk7wooem2#

我遇到了同样的问题,因此除了排除spring-boot-starter-tomcat之外,我还必须排除tomcat-embed-*jar,我是通过gradle配置完成此操作的

configurations {
  compile.exclude module: 'spring-boot-starter-tomcat'
  compile.exclude group: 'org.apache.tomcat'
}
7rfyedvj

7rfyedvj3#

gradle

在Gradle 6中,这对我来说是有效的,没有上面提到的模块排除:

configurations {
    compile.exclude module: 'spring-boot-starter-tomcat'
}

插件配置

spring boot gradle plugin documentation 4.2.1建议如下声明所提供的依赖关系(假设您构建了一个war):

providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'

依赖关系不会从战争中移除,而是移动到一个通常不会造成伤害的地方。

WEB-INF/lib-provided/spring-boot-starter-tomcat-2.2.4.RELEASE.jar
WEB-INF/lib-provided/tomcat-embed-websocket-9.0.30.jar
WEB-INF/lib-provided/tomcat-embed-core-9.0.30.jar
WEB-INF/lib-provided/tomcat-embed-el-9.0.30.jar
dfty9e19

dfty9e194#

使用KotlinGradle DSL:

configurations {
    implementation.configure {
       exclude(module = "spring-boot-starter-tomcat")
       exclude("org.apache.tomcat")
    }
}
e5nqia27

e5nqia275#

Krešimir Nesek的回答启发了我去解决我的bug。但是我解决它的方式有点不同。
我的问题是通过在Kotlin中的WebFlux和springCoroutines上构建的模块中包含其他带有Spring-Boot的模块来引发的。
我在Kotlin的方式是:

exclude("org.springframework.boot", "spring-boot-starter-tomcat")

第一个参数"org.springframework.boot"用于组,第二个参数用于特定模块。

nc1teljy

nc1teljy6#

依赖项的完整示例(KotlinDSL):

implementation(group = "org.springframework.boot", name = "spring-boot-starter-web") {
   exclude(module = "spring-boot-starter-tomcat")
}

相关问题