当前位置:网站首页>Gradle系列——Gradle插件(基于Gradle文档7.5)day3-2
Gradle系列——Gradle插件(基于Gradle文档7.5)day3-2
2022-08-02 06:39:00 【简明编程】
Gradle系列——Gradle插件(基于Gradle文档7.5)day3-2
Gradle插件
插件可以
- 可以添加任务【task】到项目中,从而帮助完成测试、编译、打包等。
- 可以添加依赖配置到项目中。
- 可以向项目中拓展新的扩展属性、方法等。
- 可以对项目进行一些约定,如应用Java插件后,约定src/main/java目录是我们的源代码存在位置,编译时编译这个目录下的Java源代码文件。
脚本插件
脚本插件的本质就是一个脚本文件,使用脚本插件时通过apply from:
将脚本加载进来就可以了,后面的脚本文件可以是本地的也可以是网络上的脚本文件,下面定义一段脚本,我们在 build.gradle文件中使用它
脚本文件模块化的基础,可按功能把我们的脚本进行拆分一个个公用、职责分明的文件,然后在主脚本文件引用,比如:将很多共有的库版本号—起管理、应用构建版本—起管理等。
实例
1.定义一个脚本文件test.gradle
ext{
maker="xxx"
projectVersion="1.0"
sdk=[
minVersion:JavaVersion.VERSION_1_8
]
}
2.在build.gradle中引入使用
使用$的方式取用
//引入
apply from:'test.gradle'
task showMsg(){
doFirst{
println("信息:${maker},${sdk.minVersion}")
}
}
二进制插件(对象插件)
就是实现了org.gradle.api.Plugin接口的插件,每个Java Gradle插件都有一个plugin id。
内部插件
- Java:为构建任何类型的 Java 项目提供支持。
- Java Library:为构建 Java 库提供支持。
- Java Platform:为构建 Java 平台提供支持。
- Groovy:为构建任何类型的 Groovy 项目提供支持。
- Scala:为构建任何类型的 Scala 项目提供支持。
- ANTLR:为使用 ANTLR 生成解析器提供支持。
- JVM Test Suite:为建模和配置多个测试套件调用提供支持。
- Test Report Aggregation:将多个测试任务调用(可能跨越多个 Gradle 项目)的结果聚合到单个 HTML 报告中。
母语
引入插件
引入方法一:
apply plugin : 'java'
引入方法二:
plugins {
id 'java'
}
第三方插件
如果是使用第三方发布的二进制插件,一般需要配置对应的仓库和类路径
引入插件
方式一:
buildscript {
ext{
springBootVersion="2.7.2"
}
repositories {
mavenLocal()
maven {
url '仓库地址'
}
}
//引入
dependencies {
classpath("插件具体地址")
}
}
//应用
apply {
plugin:'org.springframework.boot'
}
方式二:
如果第三方插件被托管到了gradle的官网,就无需使用buildscript里配置classpath,直接引用
plugins {
id 'org.springframework.boot' version '2.7.2'
}
用户自定义插件
注意,这只能在本项目中使用,其他项目无法使用
Gradle 插件打包了可重用的构建逻辑片段,可用于许多不同的项目和构建。 Gradle 允许您实现自己的插件,因此您可以重用您的构建逻辑,并与他人共享。
你可以用任何你喜欢的语言来实现 Gradle 插件,只要实现最终编译为 JVM 字节码
编写自定义插件
要创建 Gradle 插件,您需要编写一个实现 Plugin 接口的类。 当插件应用于项目时,Gradle 会创建插件类的实例并调用实例的 Plugin.apply() 方法。 项目对象作为参数传递,插件可以根据需要使用它来配置项目。
在build.gradle中
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('hello') {
doLast {
println 'Hello from the GreetingPlugin'
}
}
}
}
// Apply the plugin
apply plugin: GreetingPlugin
测试
使用以下命令进行执行
gradle -q hello
自定义插件扩展
注意,这只能在本项目中使用,其他项目无法使用
大多数插件为构建脚本和其他插件提供了一些配置选项,用于自定义插件的工作方式。 插件使用 扩展对象 。 Gradle 项目 有一个关联的 ExtensionContainer 对象 其中包含已应用于项目的插件的所有设置和属性。 您可以通过向此容器添加扩展对象来为您的插件提供配置。 扩展对象只是具有代表配置的 Java Bean 属性的对象。
让我们在项目中添加一个简单的扩展对象。 这里我们添加一个 greeting项目的扩展对象,它允许您配置问候语
抽象类方式
GreetingPluginExtension是一个具有名为的属性的对象 message. 扩展对象以名称添加到项目中 greeting. 然后,此对象可用作与扩展对象同名的项目属性
//构建抽象类,设置方法
abstract class GreetingPluginExtension {
abstract Property<String> getMessage()
GreetingPluginExtension() {
message.convention('Hello from GreetingPlugin')
}
}
//书写自定义插件类,使用project.extensions.create引入抽象类
//使用extension.message.get()调用方法
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
// Add the 'greeting' extension object
def extension = project.extensions.create('greeting', GreetingPluginExtension)
// Add a task that uses configuration from the extension object
project.task('hello') {
doLast {
println extension.message.get()
}
}
}
}
//引入
apply plugin: GreetingPlugin
// 设置要打印的字符串
greeting.message = 'Hi from Gradle'
测试
gradle -q hello
//结果
Hi from Gradle
接口方式
通常,您需要在单个插件上指定多个相关属性。 Gradle 为每个扩展对象添加了一个配置块,因此您可以将设置组合在一起
interface GreetingPluginExtension {
Property<String> getMessage()
Property<String> getGreeter()
}
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
def extension = project.extensions.create('greeting', GreetingPluginExtension)
project.task('hello') {
doLast {
println "${extension.message.get()} from ${extension.greeter.get()}"
}
}
}
}
apply plugin: GreetingPlugin
// Configure the extension using a DSL block
greeting {
message = 'Hi'
greeter = 'Gradle'
}
测试
gradle -q hello
Hi from Gradle
自定义插件(当前工程全局使用)
这种方式官网称为预编译脚本插件
从 Gradle 6.4 开始提供 Groovy DSL 预编译脚本插件。 Groovy DSL 预编译脚本插件可以应用在使用 Gradle 5.0 及更高版本的项目中
要应用预编译脚本插件,您需要知道它的 ID,该 ID 源自插件脚本的 文件名
例如,脚本 src/main/groovy/java-library-convention.gradle会有一个插件 ID java-library-convention. 同样地, src/main/groovy/my.java-library-convention.gradle将导致插件 ID 为 my.java-library-convention
使用它们,我们会构建buildSrc项目
buildSrc是Gradle.默认的插件目录,编译Gradle的时候会自动识别这个目录,将其中的代码编译为插件。
构建步骤
1.首先先建立一个名为 buildSrc的java Module
此时会报这个错误
2.将 buildSrc. 从included modules移除,重新构建
找的父工程中的settings.gradle文件删除引用
刷新gradle
3. 然后只保留build.gradle和src/ main目录
其他全部删掉,注意名字一定是buildSrc,不然会找不到插件
4.修改build.gradle文件
apply plugin:'groovy'
apply plugin: 'maven-publish'
dependencies {
implementation gradleApi()
implementation localGroovy()
}
repositories {
mavenCentral()
google()
}
//项目入口设置
sourceSets {
main{
groovy{
srcDir 'src/main/groovy'
}
}
}
5.创建自定义Plugin类实现Plugin接口
package test
import org.gradle.api.Plugin
import org.gradle.api.Project
class Test1 implements Plugin<Project> {
@Override
void apply(Project project) {
project.task("hello"){
doFirst {
println("user define plugin")
}
}
}
}
6.创建definePlugin.properties文件
在resources下创建resources/META-INF/gradle-plugins/definePlugin1.properties
配置加载信息
implementation-class=test.Test1
7.在需要使用的项目中引用
找到需要使用的项目的build.gradle文件
apply plugin:'definePlugin1'
8.测试
自定义插件(暴露给其他项目使用)
这里需要我们发布到maven或gradle的仓库才可以
这里大家就看官方文档吧–>官方文档
插件的注意点
1.插件的引用
apply plugin: '插件名'
2.插件的功能
当我们在工程中引入插件后,插件会自动的为我们的工程添加一些额外的任务来完成相应的功能。
我们可以使用gradle tasks
查看
3.工程项目目录结构
使用tree
命令进行查看项目目录结构
插件的目录结构多有不同,所以我们必须要关注插件目录结构,这样可以提高我们的效率
4.依赖管理
关注如何引用依赖插件
5.关注属性和方法
具体文档地址
以下是Java插件常见属性
属性名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
reportsDirName | String | reports | 生成报告的目录名称 |
reportsDir | File(只读) | buildDir/rep.ortsDirName | 生成报告的目录 |
testResultsDirName | String | test-results | 生成测试result.xml文件的目录名称 |
testResultsDir | File(只读) | reportsDir/testReportDirName | 生成测试报告的目录 |
libsDirName | String | libs | 生成 lib库的目录名称 |
libsDir | File (只读) | buildDir/libsDirName | 生成lib库的目录 |
distsDirName | String | distributions | 生成发布文件的目录名称 |
distsDir | File (只读) | buildDir/distsDirName | 生成发布文件的目录 |
docsDirName | String | docs | 生成帮助文档的目录名称 |
docsDir | File(只读) | buildDir/docsDirName | 生成帮助文档的目录 |
dependencyCacheDirName | String | dependency-cache | 存储缓存资源依赖信息的目录名称 |
dependencyCacheDir | File (只读) | buildDir/dependencyCacheDirName | 存储缓存资源依赖信息的目录 |
边栏推荐
猜你喜欢
随机推荐
【机器学习】实验4布置:AAAI会议论文聚类分析
request.getSession(), the story
php删除一维数组中一个值
Vscode连接远程服务器出现‘Acquiring lock on/home/~’问题
2022.07.31(LC_6132_使数组中所有元素都等于零)
[Dataset][VOC] Eyewear dataset 6000 in VOC format
Vscode connect to remote server "Acquiring the lock on the/home / ~ 'problem
punch day05
【暑期每日一题】洛谷 P3156 【深基15.例1】询问学号
封装class类一次性解决全屏问题
【机器学习】课程设计布置:某闯关类手游用户流失预测
实例029:反向输出
Redis 常用命令和基本数据结构(数据类型)
PWA 踩坑 - 第一次加载页面后无法获取CacheStorage某些资源
Expert Insights | 3 ways to seize innovation opportunities in a downturn
Unity Shader学习(七)纹理图像的简单使用
Connection reset by peer 问题解析
jvm 二之 栈帧内部结构
(笔记整理未完成)【图论】图的遍历
yml字符串读取时转成数字了怎么解决