• Gradle系列——Gradle插件(基于Gradle文档7.5)day3-2


    Gradle插件

    插件可以

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

    在这里插入图片描述

    脚本插件

    脚本插件的本质就是一个脚本文件,使用脚本插件时通过apply from:将脚本加载进来就可以了,后面的脚本文件可以是本地的也可以是网络上的脚本文件,下面定义一段脚本,我们在 build.gradle文件中使用它

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

    实例

    1.定义一个脚本文件test.gradle

    ext{
        maker="xxx"
        projectVersion="1.0"
        sdk=[
                minVersion:JavaVersion.VERSION_1_8
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.在build.gradle中引入使用

    使用$的方式取用

    //引入
    apply from:'test.gradle'
    task showMsg(){
        doFirst{
            println("信息:${maker},${sdk.minVersion}")
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    二进制插件(对象插件)

    就是实现了org.gradle.api.Plugin接口的插件,每个Java Gradle插件都有一个plugin id。

    在这里插入图片描述

    内部插件

    1. Java:为构建任何类型的 Java 项目提供支持。
    2. Java Library:为构建 Java 库提供支持。
    3. Java Platform:为构建 Java 平台提供支持。
    4. Groovy:为构建任何类型的 Groovy 项目提供支持。
    5. Scala:为构建任何类型的 Scala 项目提供支持。
    6. ANTLR:为使用 ANTLR 生成解析器提供支持。
    7. JVM Test Suite:为建模和配置多个测试套件调用提供支持。
    8. Test Report Aggregation:将多个测试任务调用(可能跨越多个 Gradle 项目)的结果聚合到单个 HTML 报告中。

    母语

    引入插件

    引入方法一:

    apply plugin : 'java'
    
    • 1

    引入方法二:

    plugins {
        id 'java'
    }
    
    • 1
    • 2
    • 3

    第三方插件

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

    引入插件

    方式一:

    buildscript {
        ext{
            springBootVersion="2.7.2"
        }
    
        repositories {
            mavenLocal()
            maven {
                url '仓库地址'
            }
        }
        //引入
        dependencies {
            classpath("插件具体地址")
        }
    }
    //应用
    apply {
        plugin:'org.springframework.boot'
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    方式二:
    如果第三方插件被托管到了gradle的官网,就无需使用buildscript里配置classpath,直接引用

    plugins {
        id 'org.springframework.boot' version '2.7.2'
    }
    
    • 1
    • 2
    • 3

    用户自定义插件

    注意,这只能在本项目中使用,其他项目无法使用
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    测试

    使用以下命令进行执行

    gradle -q hello
    
    • 1

    自定义插件扩展

    注意,这只能在本项目中使用,其他项目无法使用
    大多数插件为构建脚本和其他插件提供了一些配置选项,用于自定义插件的工作方式。 插件使用 扩展对象 。 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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    测试

    gradle -q hello
    //结果
    Hi from Gradle
    
    • 1
    • 2
    • 3

    接口方式

    通常,您需要在单个插件上指定多个相关属性。 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'
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    测试

    gradle -q hello
    Hi from Gradle
    
    • 1
    • 2

    自定义插件(当前工程全局使用)

    这种方式官网称为预编译脚本插件

    从 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'
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    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")
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    6.创建definePlugin.properties文件

    在resources下创建resources/META-INF/gradle-plugins/definePlugin1.properties
    在这里插入图片描述

    配置加载信息

    implementation-class=test.Test1
    
    • 1

    7.在需要使用的项目中引用

    找到需要使用的项目的build.gradle文件

    apply plugin:'definePlugin1'
    
    • 1

    8.测试

    在这里插入图片描述

    自定义插件(暴露给其他项目使用)

    这里需要我们发布到maven或gradle的仓库才可以
    这里大家就看官方文档吧–>官方文档

    插件的注意点

    1.插件的引用

    apply plugin: '插件名'
    
    • 1

    2.插件的功能

    当我们在工程中引入插件后,插件会自动的为我们的工程添加一些额外的任务来完成相应的功能。
    我们可以使用gradle tasks查看

    在这里插入图片描述

    3.工程项目目录结构

    使用tree命令进行查看项目目录结构
    插件的目录结构多有不同,所以我们必须要关注插件目录结构,这样可以提高我们的效率

    4.依赖管理

    关注如何引用依赖插件

    5.关注属性和方法

    具体文档地址
    以下是Java插件常见属性

    属性名称类型默认值描述
    reportsDirNameStringreports生成报告的目录名称
    reportsDirFile(只读)buildDir/rep.ortsDirName生成报告的目录
    testResultsDirNameStringtest-results生成测试result.xml文件的目录名称
    testResultsDirFile(只读)reportsDir/testReportDirName生成测试报告的目录
    libsDirNameStringlibs生成 lib库的目录名称
    libsDirFile (只读)buildDir/libsDirName生成lib库的目录
    distsDirNameStringdistributions生成发布文件的目录名称
    distsDirFile (只读)buildDir/distsDirName生成发布文件的目录
    docsDirNameStringdocs生成帮助文档的目录名称
    docsDirFile(只读)buildDir/docsDirName生成帮助文档的目录
    dependencyCacheDirNameStringdependency-cache存储缓存资源依赖信息的目录名称
    dependencyCacheDirFile (只读)buildDir/dependencyCacheDirName存储缓存资源依赖信息的目录
  • 相关阅读:
    云备份客户端——数据管理模块
    使用cmd登录阿里云服务器
    DOM&BOM
    SSM学习——Rest风格与案例(12)
    Java-API简析_java.util.Objects类(基于 Latest JDK)(浅析源码)
    ICCV 2023|小红书 4 篇入选论文亮点解读,「开集视频目标分割」获得 Oral
    前端框架的发展历程
    安全清理C盘空间,5个基操,还你一个流畅办公体验
    多线程,进程
    线程的状态
  • 原文地址:https://blog.csdn.net/qq_51553982/article/details/126113616