当前位置: 首页 > news >正文

Gradle插件的分析与使用

使用Gradle 插件可以促进代码重用、减少类似功能代码的编写、提升工作效率 ,促进项目更高程度的模块化、自动化、便捷化,实现可插拔式的扩展项目的功能。

1 插件的作用

在项目构建过程中做很多事情,把插件应用到项目中,通常可以完成:

  1. 可以添加任务【task】到项目中,从而帮助完成测试、编译、打包等。
  2. 可以添加依赖配置到项目中。
  3. 可以向项目中拓展新的扩展属性、方法等。
  4. 可以对项目进行一些约定,如应用 Java 插件后,约定 src/main/java 目录是我们的源代码存在位置,编译时编译这个 目录下的 Java 源代码文件。

2 插件的分类和使用

在这里插入图片描述

2.1 脚本插件

脚本插件的本质就是一个脚本文件,使用脚本插件时通过 apply from:将脚本加载进来就可以了,后面的脚本文件可以是 本地的也可以是网络上的脚本文件。下面创建脚本文件version.gradle,在 build.gradle 文件中使用它,具体如下:
version.gradle的内容:

ext {company = "腾讯"cfgs = [compileSdkVersion: JavaVersion.VERSION_1_8]spring = [version: '5.0.0']
}

在 build.gradle 文件中使用

apply from: 'version.gradle'
task taskVersion {doLast {println "公司名称为:${company},JDK版本是${cfgs.compileSdkVersion},Spring版本号是${spring.version}"}
}

命令行执行gradle taskVersion,执行结果:
在这里插入图片描述

我们可以按功能把脚本进行拆分一个个公用、职责分明的文件,对脚本文件模块化,然后在主脚本文件引用, 比如:将很多共有的库版本号一起管理、应用构建版本一起管理等。

2.2 对象插件之内部插件

二进制插件[对象插件]就是实现了 org.gradle.api.Plugin 接口的插件,每个 Java Gradle 插件都有一个 plugin id。

在这里插入图片描述
可通过如下方式使用一个 Java 插件:

//第一种:map具名参数方式
apply plugin : 'java'
//第二种:使用闭包作为project.apply方法的一个参数
apply{plugin 'java'
}

通过上述代码就将 Java 插件应用到我们的项目中了,对于 Gradle 自带的核心插件都有唯一的 plugin id,其中 java 是 Java 插件的 plugin id,这个 plugin id 必须是唯一的,可使用应用包名来保证 plugin id 的唯一性

这里的 java 对应的具体类型是 org.gradle.api.plugins.JavaPlugin,所以还可以使用如下方式使用 Java 插件:

// 使用方式1:Map具名参数,全类名
apply plugin:org.gradle.api.plugins.JavaPlugin
// 使用方式2:org.gradle.api.plugins默认导入
apply plugin:JavaPlugin

Gradle 中提供的二进制插件【核心插件】,可参考:
https://docs.gradle.org/current/userguide/plugin_reference.html

2.3 对象插件之第三方插件

如果是使用第三方发布的二进制插件,一般需要配置对应的仓库和类路径。

传统的 buildscript 方式引入第三方插件,需要注意的是如果使用老式插件方式 buildscript{}要放在 build.gradle 文件的最前面,而新式 plugins{}没有该限制。

在这里插入代码片

如果是第三方插件已经被托管在 https://plugins.gradle.org/ 网站上,就可以不用在buildscript 里配置 classpath 依赖了,直接使用新出的 plugins DSL 的方式引用,并且 plugins DSL不需要放到build.gradle的最前面。

使用 plugins DSL 方式的案例如下:

plugins { id 'org.springframework.boot' version '2.4.1' 
}

托管在网站 gradle 插件官网的第三方插件即可以使用传统的 buildscript 方式,也可以使用 plugins DSL 方式 。

2.4 对象插件之用户自定义插件

参考地址:https://docs.gradle.org/current/userguide/custom_plugins.html

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'
}

我们直接执行 hello 任务./gradle hello 即可
在这里插入图片描述
这种方式实现的插件我们一般不使用,因为这种方式局限性太强,只能本 Project,而其他的 Project 不能使用。

2.4.1 buildSrc项目

buildSrc 是 Gradle 默认的插件目录,编译 Gradle 的时候会自动识别这个目录,将其中的代码编译为插件。

  1. 首先先建立一个名为 buildSrc 的 Java Module,将 buildSrc 从 included modules 移除,重新构建,然后只保留 build.gradle 和 src/main 目录,其他全部删掉,注意名字一定是 buildSrc,不然会找不到插件。

  2. 然后修改 build.gradle 中的内容

apply plugin: 'groovy'
//必须 
apply plugin: 'maven-publish'
dependencies {//必须 implementation gradleApi()//必须 implementation localGroovy()}
repositories {google()jcenter()mavenCentral()
}
// 把项目入口设置为src/main/groovy 
sourceSets {main {groovy {srcDir 'src/main/groovy'}}
}
  1. 创建入口目录,在 src/main 下创建代码入口目录,如下:
    在这里插入图片描述

  2. 然后实现插件代码 Text.groovy,注意文件后缀为 groovy,文件要引入 package com.atguigu

package org.exampleimport org.gradle.api.Plugin
import org.gradle.api.Projectclass Text implements Plugin<Project> {@Overridevoid apply(Project project) {project.task("customPlugin") {doLast {println("This is a customPlugin")}}}
}
  1. 接下来在 main 目录下创建 resources 目录,在 resources 目录下创建 META-INF 目录,在 META-INF 目录下创建 gradle-plugins 目录,在 gradle-plugins 目录下创建 properties 文件 。properties 文件可以自己命名,但是要以.properties 结尾,比如 org.example.plugin.properties,其 org.example.plugin 就是定义的包名路径。
    在这里插入图片描述

  2. 最后需要在 properties 文件中指明我们实现插件的全类名

implementation-class=com.atguigu.Text

在plugin-test模块的build.gradle中引入插件

apply plugin:'org.example.plugin'

执行插件中的任务gradle customPlugin,查看结果输出
在这里插入图片描述

这种自定义插件的写法,在我们整个工程的 module 都可以使用,但也只是限制在本工程,其他工程不能使用。

2.4.2 上传自定义插件

上面写插件的方式只能在插件所在的项目工程中使用,而其他的项目工程不能使用。如果我们需要一个插件在多个工程中使用, 这时候就需要把插件上传 maven 中。

第一步: 首先将上述 buildSrc 目录复制一份,修改文件夹名,然后在 settings.gradle 文件中使用 include 引入
在这里插入图片描述
第二步:修改 build.gradle 文件,发布到 Maven 仓库中。
这里设置的是发布到本地仓库D:\devTool\maven\repository目录下

apply plugin: 'groovy'
apply plugin: 'maven-publish'
dependencies {implementation gradleApi()implementation localGroovy()repositories {google()jcenter()mavenCentral()}sourceSets {//把项目入口设置为src/main/groovymain {groovy {srcDir 'src/main/groovy'}}}
}
publishing {publications {myLibrary(MavenPublication) {//指定GAV坐标信息groupId = 'org.example.plugin'artifactId = 'library'version = '1.0'//发布jar包from components.java}}repositories {//发布项目到本地仓库中maven {url "D:\\devTool\\maven\\repository"}}
}

如果有私服仓库的地址的话,新增配置示例:

publishing {publications {myLibrary(MavenPublication) {//指定GAV坐标信息groupId = 'org.example.plugin'artifactId = 'library'version = '1.0'//发布jar包from components.java}}repositories {//发布项目到本地仓库中maven {url "D:\\devTool\\maven\\repository"}//发布项目到私服仓库中maven {//name属性可选 , 表示仓库名称 , url必填name = 'myRepo'//change URLs to point to your repos, e.g. http://my.org/repourl='http://my.org/repo'//认证信息:用户名和密码credentials {username = 'admin'password = 'admin'}}}
}

第三步:执行 publish 指令
在这里插入图片描述
然后查看目录,可以看到插件已经发布到了本地仓库上。
在这里插入图片描述

第四步:使用插件,在项目级 build.gradle 文件中将插件添加到 classpath:

buildscript {repositories {mavenLocal()maven {url "D:\\devTool\\maven\\repository"}}dependencies {classpath("org.example.plugin:library:1.0")}
}

第五步

执行 gradle build 指令就会在控制台看到自定义插件的输出,说明自定义插件就已经生效了。

3 插件的关注点

第一点: 插件的引用

apply plugin: '插件名' 

第二点:主要的功能[任务] 当我们在工程中引入插件后,插件会自动的为我们的工程添加一些额外的任务来完成相应的功能。以 Java 插件为例,当 我们加入 java 插件之后,就加入了如下功能:

在这里插入图片描述
具体大家可通过 gradle tasks 查看加入某个插件前后的区别。 说明:Gradle 中的任务依赖关系是很重要的,它们之间的依赖关系就形成了构建的基本流程。

第三点:工程目录结构 一些插件对工程目结构有约定,所以我们一般遵循它的约定结构来创建工程,这也是 Gradle 的“约定优于配置”原则。 例如 Java插件规定的项目源集目录结构如下所示:
在这里插入图片描述
如果要使用某个插件就应该按照它约定的目录结构设置,这样能大大提高我们的效率,当然各目录结构也可以自己定义。

第四点:依赖管理
比如前面我们提到的依赖的类型[依赖管理]部分,不同的插件提供了不同的依赖管理。

第五点:常用的属性

例如:Java 插件会为工程添加一些常用的属性,我们可以直接在编译脚本中直接使用。
在这里插入图片描述
当然,这里还有一些其它属性
在这里插入图片描述

4 Java插件分析

参考官网:https://docs.gradle.org/current/userguide/plugin_reference.html,以 Java 插件为例,需要关注的几点:

第一点:我们要关注插件使用

plugins { id 'java' }

第二点:我们要关注插件的功能 我们可通过官方文档介绍了解某个插件功能、或者大家可以通过 gradle tasks 查看加入 java 插件前后的区别。

第三点:项目布局一般加入一个插件之后,插件也会提供相应的目录结构,例如:java

在这里插入图片描述
当然这个默认的目录结构也是可以改动的例如:

sourceSets { main {java {srcDirs = ['src/java'] }resources {srcDirs = ['src/resources'] } } 
}

也可设置源集的属性等信息

在这里插入图片描述
在这里插入图片描述
第五点:查看额外的属性和方法,如 sourceCompatibility(JavaVersion.VERSION_1_8)

http://www.dtcms.com/a/392165.html

相关文章:

  • 如何避免everything每次都重建索引
  • 基于SIFT+flann+RANSAC+GTM算法的织物图像拼接matlab仿真,对比KAZE,SIFT和SURF
  • 笔记:现代操作系统:原理与实现(3)
  • 【智能系统项目开发与学习记录】Docker 基础
  • 数据展示方案:Prometheus+Grafana+JMeter 备忘
  • flask获取ip地址各种方法
  • 17.6 LangChain多模态实战:语音图像文本融合架构,PPT生成效率提升300%!
  • MyBatis实战教程:SQL映射与动态查询技巧
  • 在 Windows Docker 中通过 vLLM 镜像启动指定大模型的方法与步骤
  • 分类预测 | Matlab实现SSA-BP麻雀搜索算法优化BP神经网络多特征分类预测
  • GO实战项目:基于 `HTML/CSS/JS + Gin + Gorm + 文心一言API`AI 备忘录应用
  • 数据结构【堆(⼆叉树顺序结构)和⼆叉树的链式结构】
  • 我爱学算法之—— 位运算(下)
  • LeetCode第364题_加权嵌套序列和II
  • 云计算和云手机之间的关系
  • 胡服骑射对中国传统文化的影响
  • leetcode-hot-100 (多维动态规划)
  • Chromium 138 编译指南 Ubuntu 篇:depot_tools安装与配置(三)
  • 在Ubuntu 16.04上安装openjdk-6/7/8-jdk的步骤
  • 小杰机器学习高级(four)——基于框架的逻辑回归
  • 基于AI分类得视频孪生鹰眼图像三维逆变换矫正算法
  • [Tongyi] 智能代理搜索范式 | 决策->行动->观察(循环迭代)
  • FLink:窗口分配器(Window Assigners)指定窗口的类型
  • GO实战项目:流量统计系统完整实现(Go+XORM+MySQL + 前端)
  • 零基础-动手学深度学习-13.10. 转置卷积
  • 【Math】初三第一、二单元测试卷(测试稿)
  • 2.Spring AI的聊天模型
  • 【连载6】 C# MVC 日志管理最佳实践:归档清理与多目标输出配置
  • autodl平台jupyterLab的使用
  • React学习教程,从入门到精通,React 开发环境与工具详解 —— 语法知识点、使用方法与案例代码(25)