我按照此文档https://docs.gradle.org/current/userguide/custom_plugins.html#sec:precompiled_plugins创建了一个基于预编译脚本类型插件的约定插件。当我从项目的根目录运行
./gradlew clean build
时,一切正常,但如果我进入使用约定插件的 prj1
子项目,则构建失败并显示以下消息:
Plugin [id: 'java-convention'] was not found in any of the following sources:
- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (plugin dependency must include a version number for this source)
项目布局:
buildSrc/
build.gradle
src/main/groovy/com/example/java-convention.gradle
prj1/
build.gradle
build.gradle
settings.gradle
根级别
build.gradle
:
plugins {
id 'java-convention'
}
根级
settings.gradle
include('prj1')
buildSrc/build.gradle
:
plugins {
id 'groovy-gradle-plugin'
}
buildSrc/src/main/groovy/com/example/java-convention.gradle
:
plugins {
id 'java'
}
java {
sourceCompatibility = JavaVersion.VERSION_21
}
prj1/build.gradle
:
plugins {
id 'java-convention'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
我认为根级别存在
buildSrc
目录会导致构建的插件 jar 文件自动添加到子项目的类路径中。如前所述,如果我从根启动构建,则构建会成功运行,但从子项目运行时会失败。我是否需要将插件 jar 显式添加到子项目的 buildscript 部分?如果是这样,由于 jar 最终位于 buildSrc/build/libs/
目录中,确切的语法是什么?有一次,我将其明确包含在 includeBuild('../buildSrc')
文件中的 prj1/settings.gradle
中,但这会产生一条错误消息,指出 buildSrc
已被保留,无法在 includeBuild()
中引用
对于子项目 - 插件应使用前缀
plugins {
id 'myproject.java-convention'
}
查看完整示例 - https://docs.gradle.org/current/samples/sample_convention_plugins.html