要只发布指定子模块,应直接执行./gradlew :module-b:publish,该命令仅触发module-b自身的publish任务,不涉及其他模块,因各子模块publish任务相互独立且未被根项目依赖。

直接在根项目执行 ./gradlew publish 会触发所有子模块的发布任务,这不是你想要的。要只发布指定子模块,关键不是“过滤”,而是**精准调用该子模块自己的 publish 任务**。
只运行某个子模块的 publish 任务
Gradle 的 publish 是每个子项目独立注册的任务(由 maven-publish 插件自动添加),它默认不参与根项目的生命周期任务依赖链。所以最简单、最可靠的方式就是跳过根项目,直接调用目标子模块的任务:
- 运行
./gradlew :module-b:publish—— 这只会构建并发布module-b模块,完全不触碰module-a或其他模块 - 如果该模块配置了多个 publication(比如
publishMavenJavaPublicationToMavenLocalRepository),也可以直接调用具体任务名,例如./gradlew :module-b:publishMavenJavaPublicationToMavenLocalRepository - 注意冒号前缀:
:module-b:是完整路径,不能漏掉开头和结尾的冒号,否则 Gradle 会报Task not found为什么 exclude 或 --exclude-task 不行
你可能试过
./gradlew publish --exclude-task :module-a:publish或在根build.gradle里写publish.dependsOn.remove(...),这些都无效,原因很实在:-
--exclude-task只能排除「已声明为依赖」的任务,而子模块的publish并不在根publish的依赖列表里——它只是被 Gradle 自动发现并批量执行的“同名任务” - 根项目的
publish本身不负责调度子模块;它是空壳,真正干活的是各子项目自己的publish任务 - 试图在根项目里用
subprojects { publish.enabled = false }会全局禁用,无法做到“只关 A、开 B”
发布前确保该子模块已 build
publish任务依赖assemble(即生成 JAR)和generatePomFileForMavenJavaPublication等前置任务。如果你只想要发布动作,不需要额外加build:-
./gradlew :module-b:publish会自动触发:module-b:jar、:module-b:generatePomFileForMavenJavaPublication等必要步骤 - 但如果你之前改过源码又没 clean,且
jar任务被跳过(因 UP-TO-DATE),而 POM 生成逻辑又依赖某些未更新的属性,就可能出错——这时可显式加clean:./gradlew :module-b:clean :module-b:publish - 本地发布到
mavenLocal时,确认repositories { mavenLocal() }已配置(通常不用手动配,maven-publish默认支持)
真正容易被忽略的是:发布任务名大小写敏感,且 publication 名称一旦自定义(如
create),对应的任务名就会变成("myPub") publishMyPubPublicationTo...。不查./gradlew :module-b:tasks | grep publish就硬敲,大概率拼错。 -











