Spring Boot项目同时使用Gradle与Maven构建的兼容问题解决
我有一个Spring Boot应用,项目结构如下:
Main - serverModule - coreModule
最初用Gradle搭建,依赖配置正常。现在要添加Maven构建配置,实现Gradle与Maven共存,但Maven构建时出现兼容错误:
incompatible types: @javax.validation.constraints.NotNull javax.servlet.http.HttpServletRequest cannot be converted to jakarta.servlet.http.HttpServletRequest
已知错误和不同版本验证库使用不同Servlet类有关,但不确定如何实现两种构建方式兼容。
已尝试的步骤:
- 替换Java相关依赖为Jakarta版本
- 复制Gradle构建中的依赖版本到Maven
- 在Maven中添加Java验证依赖(Gradle中仅需
implementation 'org.springframework.boot:spring-boot-starter-validation'即可提供验证功能) - 在Maven中将OkHttp依赖更新为
com.squareup.okhttp3(Gradle中使用implementation 'com.c.okhttp3:okhttp:4.10.0'可正常工作)
但仍无法解决错误,无法正常使用两种构建方式。
1. 统一Spring Boot版本与Jakarta依赖对齐
确保Gradle和Maven使用完全相同的Spring Boot版本:Spring Boot 2.x依赖javax.servlet,3.x全面切换为jakarta.servlet,版本不一致必然导致类型冲突。
- Maven
pom.xml锁定父版本:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>你的Spring Boot版本(如3.2.0)</version> <relativePath/> </parent>
- Gradle
build.gradle同步版本:
plugins { id 'org.springframework.boot' version '你的Spring Boot版本(如3.2.0)' // 其他插件配置 }
2. 排除Maven中冲突的javax依赖
运行mvn dependency:tree查看依赖树,找出引入javax.servlet或旧版validation库的依赖,手动排除并显式引入Jakarta版本:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <exclusions> <exclusion> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </exclusion> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入Jakarta验证API --> <dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> </dependency>
3. 统一模块间的依赖传递
检查coreModule的Maven配置,确保所有涉及验证、Servlet的依赖都是Jakarta版本,避免子模块向serverModule传递旧版javax依赖。同时对比./gradlew dependencies和mvn dependency:tree的输出,找出Gradle自动处理但Maven遗漏的依赖排除项。
4. 修正代码中的导入语句
确保代码中所有Servlet、Validation相关导入统一为Jakarta版本:
- 替换
import javax.servlet.http.HttpServletRequest;为import jakarta.servlet.http.HttpServletRequest; - 替换
import javax.validation.constraints.NotNull;为import jakarta.validation.constraints.NotNull;
5. 同步OkHttp依赖坐标
Gradle中使用的com.c.okhttp3:okhttp:4.10.0是错误坐标,修正为官方正确坐标,确保Gradle和Maven依赖一致:
// Gradle implementation 'com.squareup.okhttp3:okhttp:4.10.0'
<!-- Maven --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.10.0</version> </dependency>
6. 清理构建缓存
清理Maven和Gradle的构建缓存,避免旧依赖残留:
- Maven:执行
mvn clean install -U - Gradle:执行
./gradlew clean build --refresh-dependencies
内容的提问来源于stack exchange,提问作者SZ.

