Gradle多模块项目怎么抽取重复的构建配置

小枫同学_6905

小枫同学_6905

2026-11-03

860人浏览

原创

应使用 Gradle 的 pluginManagement + dependencyManagement 两级控制:通过 gradle/libs.versions.toml 统一管理版本、bundles 和 libraries,并在 settings.gradle 中配置 pluginManagement 和 enableFeaturePreview('typesafe-project-accessors');子模块仅声明插件 ID,不写版本;统一构建逻辑用 subprojects(非 allprojects);测试依赖通过 plugins.withId('java') 条件引入。

gradle多模块项目怎么抽取重复的构建配置

重复的 plugins 和 dependencies 怎么统一声明

多模块项目里每个 build.gradle 都写一遍 id 'java'、id 'org.springframework.boot' version '3.3.0',不仅冗余,升级时还容易漏改。正确做法是用 Gradle 的 pluginManagement + dependencyManagement 两级控制。

在根目录 settings.gradle 同级建 gradle/libs.versions.toml(推荐),或用 gradle.properties 管理版本;再在 settings.gradle 里通过 pluginManagement 声明插件版本和应用范围:

pluginManagement {
    plugins {
        id('java') version '17.0.2'
        id('org.springframework.boot') version '3.3.0'
    }
    resolutionStrategy {
        eachPlugin {
            if (requested.id.namespace == 'org.springframework.boot') {
                useModule('org.springframework.boot:spring-boot-gradle-plugin:${requested.version}')
            }
        }
    }
}

子模块只需写 plugins { id 'org.springframework.boot' },不用带 version,版本由根配置兜底。

allprojects 和 subprojects 该选哪个

allprojects 会作用于根项目本身(即 rootProject),而根项目通常不参与编译,只做协调。如果在里面加 apply plugin: 'java' 或配置 sourceCompatibility,会导致根项目尝试编译源码,报 Could not resolve all files for configuration ':compileClasspath' 这类错误。

所以统一构建逻辑一律用 subprojects:

subprojects {
    apply plugin: 'java'
    java {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    repositories {
        mavenCentral()
    }
}
  • allprojects 只适合放 repositories 全局源(但更推荐放在 pluginManagement 或 settings.gradle 的 dependencyResolutionManagement)
  • subprojects 是实际配置 Java 编译、依赖、测试等行为的唯一安全位置
  • 若某个模块(如 infrastructure)需要额外依赖,单独在它自己的 build.gradle 里追加 implementation 即可,不破坏统一性

怎么让不同模块复用相同的 testImplementation 依赖

像 junit-jupiter、mockito-core、assertj 这类测试依赖,90% 模块都用得上,但直接写死在 subprojects 里会污染非测试模块(比如纯 data model 模块可能不需要 JUnit)。

解决方案是用 withPlugin 条件加载:

subprojects {
    plugins.withId('java') {
        dependencies {
            testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'
            testImplementation 'org.mockito:mockito-core:5.12.0'
            testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.2'
        }
        tasks.test {
            useJUnitPlatform()
        }
    }
}

这样只有真正应用了 java 插件的模块才会引入测试依赖,避免误配。

gradle/libs.versions.toml 里怎么定义多层级别依赖

单靠 versions 表不能表达 “Spring Boot BOM 控制所有 starter 版本” 这种语义。必须用 bundles + libraries + versions 三层配合:

[versions]
springBoot = "3.3.0"
junit = "5.10.2"

[libraries]
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" }
spring-boot-starter-web = { module = "org.springframework.boot:spring-boot-starter-web" }

[bundles]
spring-boot-dependencies = ["spring-boot-starter-web", "spring-boot-starter-data-jpa"]

子模块中就能简洁引用:

dependencies {
    implementation libs.bundles.`spring-boot-dependencies`
    testImplementation libs.junit.jupiter
}

注意:libs.bundles.xxx 是 Gradle 自动展开的,不是字符串拼接;反引号仅在 bundle 名含连字符时必需。

最容易被忽略的是:libs.versions.toml 不会自动生效,必须在 settings.gradle 显式启用:

enableFeaturePreview('typesafe-project-accessors')

否则 libs 命名空间根本不存在,会报 Could not get unknown property 'libs'。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

2026.05.09

389

25

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

2026.11.03

0

12

码上飞入口地址合集
码上飞入口地址合集

本专题汇总了码上飞(CodeFlying)的官方入口地址合集,涵盖官网主站及网页版在线使用入口,支持注册登录后直接在线体验零代码AI应用生成。同时整理了APP端下载渠道与小程序入口,助你快速访问平台,通过自然语言描述需求即可生成应用、小程序或网站。

2026.11.03

0

10

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

20

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

20

17

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

2026.11.02

20

17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

120

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Gradle 9 主版本升级指南
Gradle 9 主版本升级指南

共0课时 | 0人学习

Gradle 安全最佳实践
Gradle 安全最佳实践

共0课时 | 0人学习

Gradle 依赖校验手册
Gradle 依赖校验手册

共0课时 | 0人学习