You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:12:47