讲师中心 微信公众号
AI工具推荐 视频效率加速

Gradle多模块项目怎么批量发布组件

星明君_2529

星明君_2529

发布时间:2026-10-25 11:22:17

|

837人浏览过

|

来源于php中文网

原创

publishToMavenLocal默认只发布执行命令所在模块,因该task不自动遍历子模块;需在各待发布子模块中显式启用maven-publish插件并配置publishing块,或通过根项目subprojects统一注入配置,同时注意过滤非发布模块、统一groupId/version、确保Android库使用androidComponents API等关键细节。

gradle多模块项目怎么批量发布组件

多模块项目里 publishToMavenLocal 为什么只发了主模块

默认情况下,publishToMavenLocal task 只在当前 project(即执行命令的目录所在模块)上运行,不会自动遍历子模块。你执行 ./gradlew publishToMavenLocal 时,如果在根目录运行,而根 project 没有应用 maven-publish 插件,那什么都不会发布;如果在某个子模块目录下运行,就只会发布那个模块。

真正要批量发布,得让所有需要发布的子模块都显式启用 maven-publish 插件,并统一配置 publishing block。常见错误是只在根 build.gradle 里写了插件,但没 propagate 到子项目。

  • 必须在每个待发布的子模块的 build.gradle 或 build.gradle.kts 中 apply maven-publish
  • 不能只在根项目 apply,除非你用 subprojects 或 allprojects 显式委托
  • publishToMavenLocal 不会自动触发依赖模块的 publish,哪怕 A 依赖 B,也得单独 publish B

如何用 subprojects 统一配置 publishing

在根项目的 build.gradle(Groovy)中,用 subprojects 块统一注入 publishing 配置,是最直接、最可控的方式。它能避免重复粘贴,也能保证 groupId、version 等基础属性一致。

注意:不要在 subprojects 里无条件 apply 插件——有些模块(比如 application 模块或脚本模块)根本不需要发布,应加判断过滤。

  • 用 plugins.withId("java-library") 或检查模块名前缀(如 name.startsWith("lib-"))来精准控制哪些模块参与发布
  • version 推荐从根 gradle.properties 读取:project.version = findProperty("VERSION_NAME") ?: "1.0.0-SNAPSHOT"
  • groupId 必须显式设置,不能依赖默认值;否则子模块可能用自己目录名当 group,导致坐标混乱
subprojects {
    plugins.withId("java-library") {
        apply(plugin = "maven-publish")
        publishing {
            publications {
                create<MavenPublication>("library") {
                    from(components["java"])
                    groupId = "com.example"
                    artifactId = project.name
                    version = project.version.toString()
                }
            }
        }
    }
}

批量执行 publish tasks 的正确姿势

Gradle 不支持像 ./gradlew :**publish 这样通配符式调用 task,但可以用 --include-build 或直接指定路径前缀。最稳妥的是用冒号拼接模块路径:

  • 发布全部子模块:./gradlew :module-a:publish :module-b:publish :module-core:publish
  • 更省事的是写个 alias 脚本,比如在 gradlew 同级建 publish-all.sh,内容为:./gradlew :module-a:publishToMavenLocal :module-b:publishToMavenLocal ...
  • 如果用了 maven-publish,别只跑 publishToMavenLocal——它只是本地快照;正式发布到私服需用 publish,且确保 publishing.repositories 已正确定义

另外,publish task 默认不依赖 build,所以建议加 dependsOn("build"),否则可能发布未编译产物。

发布时容易漏掉的三个关键点

很多团队卡在“包传上去了但引用失败”,问题往往不出在命令本身,而在 publishing 配置的细节缺失:

  • generatePomFileForXPublication task 是自动生成 pom 的,但如果子模块有 custom pom 配置(比如添加 license、scm),就得手动写 pom.withXml,否则上传后 pom 缺失关键元数据
  • Android 库模块(com.android.library)必须用 androidComponents API 替代 components["java"],否则 aar 不会被包含进 publication
  • 签名环节常被忽略:发布到中央仓库等公开源必须 GPG 签名,本地私服虽可跳过,但若团队规范要求校验,signing 插件和 sign publish 就不能少

真正麻烦的不是“怎么发”,而是“发完别人能不能正常 resolve”。每发一个组件,最好立刻在另一个空项目里试 implementation 'com.example:module-a:1.0.0',确认依赖图干净、没有 transitive 冲突、Javadoc 和 sources 也同步可用。

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

3980

2025.09.15

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

369

2026.05.09

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

40

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

20

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

20

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

0

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

20

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

20

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

20

2026.10.22

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn