Gradle学习笔记之插件

news2024/11/19 7:25:28

文章目录

  • 插件的作用
  • 插件的分类和使用
    • 脚本插件
    • 对象插件
    • 第三方插件
    • 用户自定义插件
  • buildSrc项目
    • 编写步骤
    • 其他项目/模块引用步骤
  • java插件常用属性

插件的作用

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

插件可以将任务添加到项目中,从而帮助完成测试、编译和打包等工作。也可以添加依赖配置到项目中,并且给项目扩展新的属性、方法等,并对项目进行一些约定。比如应用java插件后,约定src/main/java目录是我们源码存放的位置,编译时要编译该目录下的java代码。

插件的分类和使用

在这里插入图片描述

脚本插件

本质上是一个本地或网络上的脚本文件,使用脚本插件时通过apply from:将脚本加载进来即可。以下面一段脚本为例:

ext {
    author = "szc"
    cfg = [
            compileSdkVersion: JavaVersion.VERSION_1_8
    ]
    hometown = [
            "city": "Anyang",
            "province": "Henan"
    ]
}

我们在build.gradle中引入并使用它:

apply from: "version.gradle"

task "test_plugin_0" {
    println "author name: ${author} from city ${hometown.city}, compileVersion is ${cfg.compileSdkVersion}"
}

运行该任务的输出如下:

10:23:17: Executing task '"test_plugin_0"'...

> Configure project :
author name: szc from city Anyang, compileVersion is 1.8

......

BUILD SUCCESSFUL in 224ms
10:23:18: Task execution finished '"test_plugin_0"'.

脚本文件是模块化的基础,可按功能将我们的脚本拆分成一个个公用且职责分明的文件,而后在主脚本文件中使用,比如将很多公用的库版本号或应用的构建版本一起管理等。

对象插件

对象插件是实现了org.gradle.api.plugin接口的插件,每个Java Gradle插件均有一个pluginId
在这里插入图片描述
可通过如下方式引用一个java插件:

apply plugin : 'java' // 方式1:引用pluginId为java的插件

apply { // 方式2: 闭包导入
    plugin "java"
}

// 方式3:全类名导入
apply plugin:org.gradle.api.plugins.JavaPlugin

// 由于org.gradle.api.plugins包默认导入,因此可用使用方式4:类名导入
apply plugin:JavaPlugin

第三方插件

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

// 使用传统的应用方式,且buildScript标签必须在所有标签之前
buildscript {
    ext {
        springBootVersion = "2.3.3.RELEASE"
    }
    repositories {
        mavenLocal()
    }

    // 此处先引入插件
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

.....

// 而后再应用插件,在plugins标签之后应用
apply plugin: 'org.springframework.boot' // 社区插件,需要事先引入,不必写版本号

如果第三方插件已经被托管在了https://plugins.gradle.org/,则无需在buildscript里配置类路径,直接用新的plugins DSL引用即可:

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

用户自定义插件

第一步,定义插件接口,以及其中的属性

interface IMyPlugin {
    Property<String> getMessage()
    Property<String> getName()
}

第二步,定义插件类,实现Plugin接口及其中的apply()方法

class MyPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        def plugin = project.extensions.create("plugin_test", IMyPlugin) // 创建自定义插件接口对象,并起名

        // 设置插件任务
        project.task("test_myplugin") {
            doLast {
                println "getMessage: ${plugin.message.get()}, getName: ${plugin.name.get()}" // 输出插件接口属性
            }
        }
    }
}

第三步,应用插件类

apply {
    plugin MyPlugin
}

第四步,给插件类中的插件接口对象属性赋值

plugin_test {
    message = "test message"
    name = "szc"
}

输出结果:

(base) PS D:\develop\ideaWorkspace\GradleTest> gradle -q test_myplugin
getMessage: test message, getName: szc

更多参见官方文档,但这种方式我们不推荐,因为局限性太强,产生的插件只能在本项目中使用。

buildSrc项目

buildSrc是Gradle默认的插件目录,编译时Gradle会自动将该目录里的源码编译为插件。

编写步骤

首先,建立一个名为buildSrc的java模块(名字固定),而后从include modules中移除,并只保留其中的build.gradlesrc/main目录,并重新构建项目的gradle
然后,将以下内容写入buildSrc/build.gradle

apply plugin: 'groovy' //必须
apply plugin: 'maven-publish'

dependencies {
    implementation gradleApi() //必须
    implementation localGroovy() //必须
}

repositories {
    google()
    jcenter()
    mavenCentral() //必须
}


// 把项目入口设置为src/main/szc
sourceSets {
     main {
         groovy {
             srcDir 'src/main/szc'
         }
     }
}

第三步,在buildSrc的项目入口中,新建文件MyPlugin.groovy(一定是groovy文件):

package com.szc

import org.gradle.api.Plugin
import org.gradle.api.Project;

public class MyPlugin implements Plugin<Project>{
    @Override
    void apply(Project project) {
        project.task("myPluginTask") {
            doLast {
                println "from my plugin Task"
            }
        }
    }
}

位置如下:
在这里插入图片描述
第四步,在buildSrc目录下,创建resources/META-INF/gradle-plugins目录,并在其中创建properties文件,文件名为MyPlugin的包名,如com.szc.properties
在这里插入图片描述
第五步,在com.szc.properties文件中,指明插件的全类名:

implementation-class = com.szc.MyPlugin

然后就可以在module中引入我们的插件了:

apply {
    plugin com.szc.MyPlugin
}

执行任务输出如下:

(base) PS D:\develop\ideaWorkspace\GradleTest> gradle -q myPluginTask
from my plugin Task

其他项目/模块引用步骤

上述方式写出来的插件也只能在本工程中使用,若要其他工程也使用,则需要进行以下步骤:
首先,在工程根路径下,复制一份上述buildSrc目录,重命名(例如myplugin),并在settings.gradle中包含:

.....
include ':myplugin'

第二步,在myplugin/build.gradle中添加publishing标签,内容如下:

publishing {
    publications {
        mylib(MavenPublication) { // 创建发布包
            groupId = 'com.szc' // 定义组ID、包ID和版本号
            artifactId = 'lib'
            version = '1.1'

            from components.java // 打成jar包
        }
    }

    repositories {
        // 发布项目到本地目录
        maven { url "$rootDir/lib/release" }

        //发布项目到私服中
//        maven {
//            name = 'myRepo'
//            url = layout.buildDirectory.dir("repo")
//            // url='http://my.org/repo'
//            credentials {
//                username = 'joe'
//                password = 'secret'
//            }
//        }
    }
}

而后,执行发布命令:
在这里插入图片描述
完成后,就可以在项目根目录/lib/release中看到发布情况:
在这里插入图片描述
这样,我们就可以在其他项目中引用我们的插件了:

buildscript {
    repositories {
        maven { url "D:\\develop\\ideaWorkspace\\GradleTest\\lib\\release" } // 本地插件库的路径
    }

    dependencies {
        classpath "com.szc:lib:1.1"
    }
}

apply plugin: 'java'
apply plugin: 'com.szc' // 插件的组ID

在其他项目中的执行输出如下:

(base) PS D:\develop\ideaWorkspace\TestGradle2> gradle -q myPluginTask
from my plugin Task

java插件常用属性

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法】 | 用队列实现栈

用队列实现栈 链接&#xff1a; https://leetcode.cn/problems/implement-stack-using-queues/ 1. 要求 2. 思路 栈的性质是先进后出&#xff0c;队列的性质是先进先出。 题目要求是用两个队列来完成栈的实现&#xff0c;那么大思路就是通过倒腾数据来完成。 3. 代码实现…

JAVA系列 多线程 Thread类 耦合 线程调度 如何创建线程 弱耦合 完全解耦 思维结构整理

这估计是我JAVA系列 基础知识点梳理的最后一篇文章了吧 之后一段时间 我打算去看看之前承诺更新的JAVA的一些项目了 然后我要好好玩一段时间游戏 然后跟某些好朋友见面 所以后面会忙一点 然后就是很多同学 六级还没有考 估计很多人是开学再考把 这个假期就不要玩的太厉害了 没事…

人员超员识别系统 yolov5

人员超员识别系统通过yolov5深度学习网络模型对现场画面进行实时监测&#xff0c;监测到画面中区域人数超过规定人数时&#xff0c;立即抓拍存档预警。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用anchor box将分类与目标定位的回归问题结合起来&#xff…

一篇彻底解决:Fatal error compiling: 无效的目标发行版: 11 -> [Help 1]

先在这声明,如果我的方法没有解决你的问题,那你直接私信我,我第一时间帮你解决,送佛送到西!!! 这个问题&#xff0c;主要原因就是JDK的版本问题&#xff0c;“无效的目标发行版&#xff1a;11”的意思是你在某个位置配置了JDK11&#xff0c;但是在其他位置配置的并不是11&…

靶机测试Gears of War笔记

靶机介绍Its a CTF machine that deals with the history of gears of war, where we must try to escape from prison and obtain root privileges. it has some rabbit holes, so you have to try to connect the tracks to get access.This works better with VirtualBox ra…

[ 数据结构 ] 二叉树详解--------前序、中序、后序、存储、线索化

0 前言 why?为什么需要树结构? 数组虽然查找快(通过下标访问),但无法动态扩容(拷贝到新的数组),而链表相反,树结构刚好结合两者优点 浅谈树? 树的存储和读取效率都很高,比如二叉排序树,理解树的抽象模型有助于理解递归的原理,树的模型接近于单向链表,父节点指向左右子树,而…

【因果发现】 针对时序数据的因果图学习

文章目录 一、任务二、数据集说明三、专业名词CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、任务 This track focuses on solving a causal structure learning problem in AIOps. AIOps 相关:主要目标是从事件序列数据中挖掘因果图关系,并辅助定位根因。 主要需要解…

php学习笔记-php数组的创建和使用,数组常用函数-day03

php数组的创建和使用&#xff0c;数组常用函数数组的概念一维数组的创建和使用1.直接将变量声明为数组元素2.通过array()函数来创建一维数组3.数组的元素值的访问4.数组元素的赋值方式5.数组的注意事项二维数组的创建和使用1.二维数组的创建2.二维数组的数组元素值访问3.二维元…

ArcGIS基础实验操作100例--实验67设置标注样式

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验67 设置标注样式 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

Java+Swing可视化图像处理软件

JavaSwing可视化图像处理软件一、系统介绍二、功能展示1.图片裁剪2.图片缩放3.图片旋转4.图像灰度处理5.图像变形6.图像扭曲7.图像移动三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统&#xff1f;四、其它1.其他系统实现2.获取源码一、系统介绍 该系统实…

Allegro174版本新功能介绍之和172版本兼容设置

Allegro174版本新功能介绍之和172版本兼容设置 Allegro升级到了174版本的时候,如果按照常规操作用174版本保存PCB之后,用172版本是无法打开的。 但是174版本开放了一个和172版本兼容的窗口,即便是174版本保存了PCB,172同样还是能够打开 具体操作如下 选择Setup选择User p…

[Linux]git命令行

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

前端入门笔记 05 —— js基础

基于ES6 生成html文件&#xff0c;script标签引入js文件 简单语句直接用console面板 <!DOCTYPE html> <html><head><title>js核心语法</title><meta charset"UTF-8" /></head><body><script src "./1.5j…

多线程(4)

文章目录1.单例模式2. 阻塞队列3. 定时器4.线程池前言 :   前面的一些文章&#xff0c;我们已经将有关多线的基础知识了解了&#xff0c; 下面我们来写一些关于多线程的代码案例&#xff0c;来强化对多线程的理解&#xff0c;另外通过这些案例补充一下其他方面的知识。 1.单例…

印度如何在云计算中抓住千载难逢的机会

云对印度的影响大流行和后大流行时期的虚拟和混合世界越来越依赖于云&#xff0c;并随之提高灵活性、敏捷性和创新性。在这场快速的数字化转型中&#xff0c;印度企业也纷纷加入云解决方案以促进业务增长。NASSCOM-EY的调查显示&#xff0c;78%的印度IT公司、53%的医疗保健和BF…

【Javascript】数字和字符串常用方法

数字常用方法&#xff1a; toFixed&#xff1a;保留小数位数&#xff0c;不够自动补0. 注意&#xff1a;返回值是字符串&#xff0c;不能和数字直接相加减&#xff0c;需要把字符串转化为数字&#xff1a;-0即可 取整&#xff1a; // round:四舍五入取整console.log(Math.roun…

SQL IN 操作符

IN 操作符 IN 操作符允许您在 WHERE 子句中规定多个值。 SQL IN 语法 SELECT column1, column2, ... FROM table_name WHERE column IN (value1, value2, ...); 参数说明&#xff1a; column1, column2, ...&#xff1a;要选择的字段名称&#xff0c;可以为多个字段。如果…

STM32——USART串口

文章目录一、通信接口二、串口通信三、硬件电路四、电平标准五、串口参数及时序六、STM32的USART外设简介七、USART框图八、USART基本结构九、数据帧十、起始位侦测和采样位置对齐十一、数据采样十二、波特率发生器十三、数据模式十四、串口发送电路设计关键代码USART_SendData…

基于Java+Swing+mysql眼镜店管理系统

基于JavaSwingmysql眼镜店管理系统一、系统介绍二、功能展示1.管理员登陆2.眼镜信息查询3.眼镜信息添加4.眼镜信息修改5.眼镜信息删除三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统&#xff1f;四、其它1.其他系统实现2.获取源码一、系统介绍 该系统实…

Linux常用命令——find命令

在线Linux命令查询工具 find 在指定目录下查找文件 补充说明 find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时&#xff0c;不设置任何参数&#xff0c;则find命令将在当前目录下查找子目录与文件。并且将查找到的子…