
本文旨在解决gradle多模块项目中,内部开发的插件无法被同项目其他模块识别和使用的问题。通过引入gradle的复合构建(composite builds)机制,特别是利用`includebuild()`在根`settings.gradle.kts`中声明插件模块,并为插件模块配置独立的`settings.gradle.kts`文件,确保gradle能够正确地构建并解析内部插件,从而实现插件的顺畅消费。
在复杂的Gradle多模块项目中,开发者常会创建自定义插件来封装通用配置或业务逻辑。然而,当尝试在同一个多模块项目中的其他模块(例如my-implementation)中应用这些内部插件(例如my-gradle-plugin)时,Gradle可能会报告“Plugin was not found”的错误。
典型的错误信息如下:
* What went wrong:
Plugin [id: 'org.my.gradle.plugin', version: '0.0.3-SNAPSHOT'] was not found in any of the following sources:
- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'org.my.gradle.plugin:org.my.gradle.plugin.gradle.plugin:0.0.3-SNAPSHOT')
Searched in the following repositories:
MavenLocal(file:/home/jenkins/.m2/repository/)
maven(https://xyz)
Gradle Central Plugin Repository
MavenRepo这个错误表明Gradle在配置的插件仓库中(包括本地Maven仓库、远程Maven仓库和Gradle插件门户)未能找到对应的插件构件。尽管在根settings.gradle.kts的pluginManagement中已经配置了mavenLocal()和其他仓库,并且通过resolutionStrategy指定了版本,但Gradle似乎并未意识到需要先构建项目内部的my-gradle-plugin模块,然后才能使用它。
解决此问题的关键在于明确告诉Gradle,my-gradle-plugin模块是一个独立的构建,其产物(即插件)需要在主构建的早期阶段被解析和使用。这可以通过Gradle的复合构建(Composite Builds)功能实现,具体步骤如下:
为插件模块创建独立的settings.gradle.kts
首先,在你的插件模块(例如my-gradle-plugin)的根目录下,创建一个空的settings.gradle.kts文件。这个文件虽然可以为空,但它的存在至关重要,它标志着my-gradle-plugin目录本身是一个独立的Gradle构建,而不是主构建的一个简单子项目。
+ root
+ my-gradle-plugin/
+ build.gradle.kts
+ settings.gradle.kts // <-- 新增此文件在根settings.gradle.kts中使用includeBuild()
在项目的根settings.gradle.kts文件中,通过pluginManagement块内的includeBuild()方法来引入插件模块。这会将插件模块作为一个复合构建的一部分,指示Gradle在解析插件时,首先考虑这个内部构建提供的插件。
修改后的根settings.gradle.kts示例如下:
// ./root/settings.gradle.kts
rootProject.name = "root-project"
// 包含其他子项目
include("my-api", "my-implementation")
pluginManagement {
// 使用 includeBuild() 声明插件模块为一个独立的构建
// Gradle 会在解析插件时,优先从这个构建中查找
includeBuild("my-gradle-plugin")
repositories {
mavenLocal()
maven { url = uri("https://xyz") }
gradlePluginPortal()
mavenCentral()
}
resolutionStrategy {
val version: String by settings
eachPlugin {
// 如果请求的插件ID与内部插件匹配,则使用当前项目版本
if (requested.id.id == "org.my.gradle.plugin") {
useVersion(version)
}
}
}
}解释:
完成上述配置后,其他模块就可以像使用任何外部插件一样,在它们的build.gradle.kts文件中应用内部插件了。
// ./my-implementation/build.gradle.kts
plugins {
// 当使用 includeBuild() 引入内部插件时,
// 推荐使用 "internal" 作为版本,这是一种约定,表示插件来自当前构建环境
id("org.my.gradle.plugin") version "internal"
}注意事项:
通过在插件模块中添加一个空的settings.gradle.kts文件,并修改根settings.gradle.kts以includeBuild("my-gradle-plugin"),我们有效地将插件模块提升为一个独立的“复合构建”。Gradle在执行主构建时,会首先处理这个复合构建,确保插件能够被编译和打包。随后,当主构建中的其他模块尝试解析org.my.gradle.plugin时,Gradle会知道去这个内部复合构建中查找,而不是仅仅依赖外部插件仓库。
这种方法使得在大型多模块项目中管理和消费内部开发的Gradle插件变得更加无缝,极大地简化了开发和测试流程。它避免了将内部插件发布到本地Maven仓库的繁琐步骤,直接在项目内部实现了插件的构建和消费闭环。
以上就是Gradle多模块项目:构建与消费内部插件的实战指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号