如何将含Gradle插件的多模块项目调整为可Maven发布结构?
解决方案:调整项目结构以支持本地运行与Maven统一发布
问题背景
需要整合以下组件:
- 可访问共享Kotlin库的Gradle插件
- 共享Kotlin库(可被插件及所有业务库模块使用)
- 可同时访问Gradle插件与共享Kotlin库的Android库模块(如module1、module2)
现有问题
当前使用复合构建(includeBuild("gradle-plugin"))实现本地依赖,虽能正常本地运行,但根项目的publishToMavenLocal/publish任务无法识别gradle-plugin子构建内的plugin和shared模块,无法统一发布所有模块到Maven仓库。
现有项目结构
根目录/ ├── settings.gradle.kts ├── gradle-plugin/ │ ├── settings.gradle.kts │ ├── plugin/ │ └── shared/ └── library/ ├── module1/ └── module2/
根目录settings.gradle.kts配置:
includeBuild("gradle-plugin") include("library/module1") include("library/module2")
gradle-plugin/settings.gradle.kts配置:
include("plugin") include("shared")
调整方案
将gradle-plugin下的子模块改为根项目的直接子模块,取消复合构建模式,具体步骤如下:
1. 调整项目结构
删除gradle-plugin目录下的settings.gradle.kts,将plugin和shared作为根项目的子模块管理,结构变为:
根目录/ ├── settings.gradle.kts ├── gradle-plugin/ │ ├── plugin/ │ └── shared/ └── library/ ├── module1/ └── module2/
2. 修改根目录settings.gradle.kts
替换原配置为直接包含所有子模块:
include("gradle-plugin:plugin") include("gradle-plugin:shared") include("library:module1") include("library:module2")
3. 配置模块间依赖
Gradle插件模块依赖共享库:在
gradle-plugin/plugin/build.gradle.kts中添加项目依赖:dependencies { implementation(project(":gradle-plugin:shared")) // 保留原Gradle插件依赖,如gradleApi()、kotlin("jvm")等 }业务库模块依赖共享库:以
library/module1/build.gradle.kts为例:dependencies { implementation(project(":gradle-plugin:shared")) // 其他业务依赖 }业务库模块使用Gradle插件:在业务库模块的
build.gradle.kts中直接通过插件ID引入(需确保插件模块已配置gradlePlugin块注册ID):plugins { id("com.example.your-plugin-id") // 替换为你的插件ID id("com.android.library") kotlin("android") }插件模块的
gradlePlugin配置示例(gradle-plugin/plugin/build.gradle.kts):plugins { `java-gradle-plugin` kotlin("jvm") } gradlePlugin { plugins { create("yourPlugin") { id = "com.example.your-plugin-id" implementationClass = "com.example.YourPluginImplementation" } } }
效果验证
- 本地运行:所有模块通过
project()依赖实现本地引用,编译、运行、调试体验与原复合构建一致。 - 统一发布:执行根项目的
publishToMavenLocal或publish任务,Gradle会自动触发所有子模块的发布流程,包括plugin、shared、module1、module2,所有模块都会被发布到目标Maven仓库。
内容的提问来源于stack exchange,提问作者prom85
相关产品推荐
相关产品推荐

