gradle 插件 自定义_Gradle自定义插件

gradle 插件 自定义

本教程介绍了创建Gradle独立自定义插件的方法。 它涵盖以下主题
  • 创建任务,并在“自定义”插件中使用
  • 独立的自定义插件
  • 简短的插件ID
  • 使用settings.gradle自定义Gradle设置

项目信息:

Gradle版本:1.1
操作系统平台:Ubuntu 12.10 先决条件:基本了解Gradle脚本。
创建独立的自定义插件

  1. 创建目录结构
    |-custom-plugin|  |-plugin|    |-src|      |-main|      |  |-groovy|      |  | |-com|      |  |   |-code4reference |      |  |     |-gradle|      |  |-resources   |      |  | |-META-INF|      |  |   |-gradle-plugins |      |-test|      |  |-groovy|      |  | |-com|      |  |   |-code4reference |      |  |     |-gradle |-user

    这里的插件目录包含所有源代码和资源文件,而用户目录包含使用自定义插件的使用者脚本。 执行以下命令以创建目录结构。 这里的groovy文件夹包含源代码包。

    $ mkdir -p custom-plugin/plugin/src/main/groovy/com/code4reference/gradle$ mkdir -p custom-plugin/plugin/src/main/resources/META-INF/gradle-plugins$ mkdir -p custom-plugin/user
  2. 自定义插件源代码

    每个插件都应该有一个实现类来扩展Plugin类。 让我们定义插件类。

    package com.code4reference.gradle;import org.gradle.api.*;class Code4ReferencePlugin implements Plugin {def void apply(Project project) {//c4rTask task has been defined below.project.task('c4rTask') << {println 'Hi from Code4Reference plugin!'}}
    }

    将此文件放在custom-plugin / plugin / src / main / groovy / com / code4reference / gradle目录中。 在这里, c4rTask任务已定义为打印一条简单的线。

  3. 简短的插件ID

    为了应用插件,我们通常使用一个简短的ID,例如apply plugin:'java'。 这里的“ java”是org.gradle.api.plugins.JavaPlugin类的简短插件ID。 简短的插件ID可以通过简单的步骤进行定义。 为此,我们需要创建一个属性文件,并将其放在类路径下的META-INF / gradle-plugins目录中。 文件名将是我们的短ID。 该属性文件必须包含以下所示的行,并且应指向插件实现类。 让我们将属性文件创建为code4reference.properties并将其指向Code4ReferencePlugin类。

    implementation-class=com.code4reference.gradle.Code4ReferencePlugin
  4. Gradle脚本生成插件

    为了编译和构建此插件,我们将编写gradle脚本。 在插件目录中创建名为build.gradle的文件, 然后在其中复制下面的内容。

    apply plugin: 'groovy'
    apply plugin: 'maven'
    dependencies {compile gradleApi()groovy localGroovy()
    }
    repositories {mavenCentral()
    }group='com.code4reference'   //Group name makes easier to manager the packages.
    version='1.1-SNAPSHOT'uploadArchives {repositories {mavenDeployer {repository(url: uri('../repo'))}}
    }

    在此gradle脚本中,我们使用groovy插件编译groovy源代码,并将gradleAPI声明为编译时间依赖项。 您可能已经注意到我们使用了maven插件。 它基本上会创建插件jar文件并将其存储在maven存储库中。 在这里,我们在父目录中创建名为repo的Maven存储库,并将jar文件存储在其中。

  5. 构建插件并放入存储库
    $ gradle uploadArchives   #This will put the plugin-version.jar in maven repository.:compileJava UP-TO-DATE
    :compileGroovy UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :jar
    :uploadArchives
    Uploading: com/code4reference/plugin/1.1-SNAPSHOT/plugin-1.1-20120816.163101-1.jar to repository remote at file:/home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-1/repo/
    Transferring 5K from remote
    Uploaded 5KBUILD SUCCESSFULTotal time: 34.892 secs
  6. 使用settings.gradle注入设置

    当执行以上命令时,gradle会从settings.gradle中获取项目名称。 如果当前目录中不存在settings.gradle文件,则它将获取当前目录的名称并将其假定为项目名称。 然后,它形成存储jar文件的路径。 文件路径约定如下/group/name/projectName/version/projectname-version-timestamp.jar 。 您可能会在上面的输出中注意到,jar路径名和jar文件名带有插件字,因为当前目录名是plugin,而gradle将其假定为项目名。 如果要覆盖此属性,并将code4ReferencePlugin作为项目名称,则需要在插件目录中创建settings.gradle文件,并放入下一行。

    rootProject.name = 'code4ReferencePlugin'

    现在再次执行命令以生成插件jar文件。

    $gradle uploadArchives
    compileJava UP-TO-DATE
    :compileGroovy UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :jar UP-TO-DATE
    :uploadArchives
    Uploading: com/code4reference/code4ReferencePlugin/1.1-SNAPSHOT/code4ReferencePlugin-1.1-20120816.164441-5.jar to repository remote at file:/home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-1/repo/
    Transferring 5K from remote
    Uploaded 5KBUILD SUCCESSFULTotal time: 8.61 secs

    现在问题解决了。 该jar的名称为code4ReferencePlugin- [version] -timestamp.jar。 如果要查找有关gradle和系统属性的更多信息,请在此处找到。

使用自定义插件

这确实是一个简单的步骤。 尽管我们使用其他插件,但是自定义插件也可以类似的方式使用。 现在在用户目录中创建另一个build.gradle文件,并复制下面给出的代码。

buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group: 'com.code4reference',name: 'code4ReferencePlugin',version: '1.1-SNAPSHOT'}
}
apply plugin: 'code4reference'

build.gradle脚本访问父目录中存在的Maven存储库。 我们还定义了依赖关系,该依赖关系基本上是从Maven访问jar文件的特定版本。 最后但并非最不重要的一点是,我们应用简短的插件ID“ code4reference”。 要运行此gradle脚本,请在用户目录中的终端上执行以下命令。

$ gradle c4rTask   #Remember we have created c4rTask in Code4ReferencePlugin class.#You will get the following output.
:c4rTask
Hi from Code4Reference plugin!BUILD SUCCESSFULTotal time: 3.908 secs

Voilà! 您刚刚创建了自定义插件,并在其他项目脚本中使用了它。 您可以在此处找到本教程的源代码。 Code4参考

现在,将涵盖以下主题。

  • 定义自定义任务类
  • 将参数传递给自定义插件任务
  • 嵌套参数
  • 测试自定义插件

项目信息:
项目名称:Gradle自定义插件
Gradle版本:1.1 操作系统平台:Ubuntu 12.10 先决条件:基本了解Gradle脚本。

在这里,我们将遵循第一部分中列出的相同目录层次结构。

  1. 定义自定义任务

    让我们定义一个名为Code4ReferenceTask的自定义类,该类扩展了DefaultTask类,并将此文件放在保存Code4ReferencePlugin.groovy的同一文件夹中。 此类包含一个名为showMessage()的方法,该方法使用@TaskAction进行注释。 执行任务时,Gradle会调用此方法。

    package com.code4reference.gradle;import org.gradle.api.DefaultTask
    import org.gradle.api.tasks.TaskActionclass Code4ReferenceTask extends DefaultTask {@TaskActiondef showMessage() {println '----------showMessage-------------'}
    }

    现在,我们需要在Code4ReferencePlugin.groovy中进行一些小的修改,以包含自定义任务。 修改后的Code4ReferencePlugin类如下。

    package com.code4reference.gradle;import org.gradle.api.*;class Code4ReferencePlugin implements Plugin {def void apply(Project project) {//Define the task named c4rTask of type Code4ReferenceTaskproject.task('c4rTask', type: Code4ReferenceTask)}
    }

    您可能会注意到,与过去的实现相比,只有突出显示的行已更改。 现在,“ c4rTask”是Code4ReferenceTask类型的。 在插件目录中执行gradle uploadArchives命令。 这将更新Maven存储库中的jar文件。 现在,使用相同的旧build.gradle在用户目录中执行以下命令。 我们将获得以下输出。

    $gradle c4rTask
    :c4rTask
    ----------showMessage-------------
    BUILD SUCCESSFULTotal time: 14.057 secs
  2. 将参数传递给自定义插件任务

    上面的实现是最简单的,并没有做很多事情。 如果我们想将Gradle脚本的参数传递给该任务怎么办? 我们可以通过访问扩展对象来实现。 Gradle项目具有关联的ExtensionContainer对象,该对象有助于跟踪传递给plugins类的所有设置和属性。 让我们定义一个扩展类,它可以容纳参数并将其传递给Task类。 Code4ReferencePlugin类中突出显示的行有助于将参数传递给Task类。

    package com.code4reference.gradle;import org.gradle.api.*;//For passing arguments from gradle script.
    class Code4ReferencePluginExtension {String message = 'Hello from Code4Reference'String sender = 'Code4Reference'
    }
    class Code4ReferencePlugin implements Plugin {def void apply(Project project) {project.extensions.create('c4rArgs', Code4ReferencePluginExtension)project.task('c4rTask', type: Code4ReferenceTask)}
    }

    我们已将Code4ReferencePluginExtension定义为Extension类,其中包含两个变量message和sender。 这些用作自定义任务的参数。 我们需要修改Code4RefernceTask类以访问参数。 高亮显示的行已添加到以前的Code4ReferenceTask类实现中。

    package com.code4reference.gradle;import org.gradle.api.DefaultTask
    import org.gradle.api.tasks.TaskActionclass Code4ReferenceTask extends DefaultTask {@TaskActiondef showMessage() {println '------------showMessage-------------------'println 'From : ${project.c4rArgs.sender},\message : ${project.c4rArgs.message}'}
    }

    在插件目录中执行gradle uploadArchives命令。 这将更新Maven存储库中的jar文件。 另外,我们需要更新用户目录中的build.gradle。

    //custom-plugin-2/user
    buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group: 'com.code4reference',name: 'code4ReferencePlugin',version: '1.2-SNAPSHOT'}
    }apply plugin: 'code4reference'c4rArgs {sender = 'Rakesh'message = 'Hello there !!!!'
    }

    您可能已经注意到,已经添加了c4rArgs闭包,并且在闭包中设置了发件人和消息变量。 这两个变量可以在showMessage()方法中访问。 现在运行用户目录中存在的build.gradle。 我们得到以下输出。

    $gradle c4rTask
    :c4rTask
    -------------------------showMessage-----------------------------
    From : Rakesh, message : Hello there !!!!BUILD SUCCESSFULTotal time: 15.817 secs
  3. 嵌套参数

    如果我们想传递嵌套参数怎么办? 我们可以通过嵌套扩展对象来实现。 这是Code4ReferencePlugin类的代码。 此类中仅添加了突出显示的行。

    package com.code4reference.gradle;import org.gradle.api.*;//Extension class for nested argumetns
    class C4RNestedPluginExtention {String receiver = 'Admin'String email = 'admin@code4reference.com'}
    //For keeping passing arguments from gradle script.
    class Code4ReferencePluginExtension {String message = 'Hello from Code4Reference'String sender = 'Code4Reference'C4RNestedPluginExtention nested = new C4RNestedPluginExtention()
    }
    class Code4ReferencePlugin implements Plugin {def void apply(Project project) {project.extensions.create('c4rArgs', Code4ReferencePluginExtension)project.c4rArgs.extensions.create('nestedArgs',C4RNestedPluginExtention)project.task('c4rTask', type: Code4ReferenceTask)}
    }

    现在也该修改Code4ReferenceTask类。 在此类中添加了突出显示的行,以访问嵌套的参数。

    package com.code4reference.gradle;import org.gradle.api.DefaultTask
    import org.gradle.api.tasks.TaskActionclass Code4ReferenceTask extends DefaultTask {@TaskActiondef showMessage() {println '------------showMessage-------------------'println 'From : ${project.c4rArgs.sender},\message : ${project.c4rArgs.message}'println 'To : ${project.c4rArgs.nestedArgs.receiver},\email : ${project.c4rArgs.nestedArgs.email}'}
    }

    在插件目录中再次执行gradle uploadArchives命令以更新Maven存储库中的jar文件。 现在,修改用户目录中存在的build.gradle文件以传递嵌套参数。

    buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group: 'com.code4reference',name: 'code4ReferencePlugin',version: '1.2-SNAPSHOT'}
    }apply plugin: 'code4reference'c4rArgs {sender = 'Rakesh'message = 'Hello there !!!!'nestedArgs{receiver = 'gradleAdmin'email = 'gradleAdmin@code4reference.com'}
    }

    我们在build.gradle文件中添加了突出显示的行。

  4. 测试插件和任务

    代码测试是代码开发的重要方面。 现在,我们将为自定义任务和插件添加单元测试。 为此,我们需要为测试类创建目录结构。 我们需要将测试文件夹放在src目录中。 在插件目录中执行以下命令以创建测试目录。

    $mkdir -p src/test/groovy/com/code4reference/gradle/

    测试目录结构遵循用于源代码包目录的相同包目录结构。 在此目录中,放入Code4ReferencePlugin和Code4ReferenceTask的测试类。 在测试类中,ProjectBuilder用于访问项目对象。 这些测试用例易于编写,类似于Junit测试用例。 测试类的代码如下:

    package com.code4reference.gradle;import org.junit.Test
    import org.gradle.testfixtures.ProjectBuilder
    import org.gradle.api.Project
    import static org.junit.Assert.*class Code4ReferenceTaskTest {@Testpublic void canAddTaskToProject() {Project project = ProjectBuilder.builder().build()def task = project.task('c4rtakstest', type: Code4ReferenceTask)assertTrue(task instanceof Code4ReferenceTask)}
    }
    package com.code4reference.gradle;import org.junit.Test
    import org.gradle.testfixtures.ProjectBuilder
    import org.gradle.api.Project
    import static org.junit.Assert.*class Code4ReferencePluginTest {@Testpublic void code4referencePluginAddsCode4ReferenceTaskToProject() {Project project = ProjectBuilder.builder().build()project.apply plugin: 'code4reference'println 'code4referencePluginAddsCode4ReferenceTaskToProject'assertTrue(project.tasks.c4rTask instanceof Code4ReferenceTask)}
    }

    要运行测试,请在plugin文件夹中执行以下命令。

    $gradle test                #For success test cases.
    :compileJava UP-TO-DATE
    :compileGroovy UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :compileTestJava UP-TO-DATE
    :compileTestGroovy
    :processTestResources UP-TO-DATE
    :testClasses
    :testBUILD SUCCESSFULTotal time: 42.799 secs$gradle test    #In case of test case failure,#you can expect output similar to given below.
    :compileJava UP-TO-DATE
    :compileGroovy UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :compileTestJava UP-TO-DATE
    :compileTestGroovy
    :processTestResources UP-TO-DATE
    :testClasses
    :testcom.code4reference.gradle.Code4ReferencePluginTest > code4referencePluginAddsCode4ReferenceTaskToProject FAILEDjava.lang.AssertionError at Code4ReferencePluginTest.groovy:142 tests completed, 1 failedFAILURE: Build failed with an exception.* What went wrong:
    Execution failed for task ':test'.
    > There were failing tests. See the report at: file:///home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-2/plugin/build/reports/tests/index.html* Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.BUILD FAILED

    Gradle测试提供了测试报告及其位置。 可以使用任何浏览器打开该文件来检查堆栈跟踪。

您可以在此处找到源代码 。

参考: Gradle自定义插件(第1部分) ,   我们的JCG合作伙伴 Rakesh Cusat的Gradle自定义插件(第2部分)来自Code4Reference博客。


翻译自: https://www.javacodegeeks.com/2012/08/gradle-custom-plugin.html

gradle 插件 自定义

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

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

相关文章

Pytorch常用操作

创建tensor x torch.empty(*sizes)  #创建一个未初始化的tensor&#xff08;后面用torch.nn.init中的一些函数进行初始化&#xff09; >>> torch.empty(2, 3) tensor(1.00000e-08 * [[ 6.3984, 0.0000, 0.0000], [ 0.0000, 0.0000, 0.0000]]) x torch.rand(5, 3…

数据聚合Spring Data MongoDB:嵌套结果

1引言 在上一篇文章中&#xff0c;我们构建了聚合管道的基本示例。 如果您需要有关如何创建项目和配置应用程序的更多详细信息&#xff0c;也许您想看看使用Spring Data MongoDB和Spring Boot进行数据聚合 。 在本文中&#xff0c;我们将重点研究一个用例&#xff0c;在这种情况…

如何消除img默认的间距

方案一:div{font-size:0};方案二:img{ display:block};方案三:img{vertical-align:top;}方案四&#xff1a;div{ margin-bottom:-3px }; 为什么会有间距呢&#xff1f; 根本原因在于img标签为inline元素&#xff0c;该元素默认垂直对齐方式为以父元素的baseline&#xff0c;但是…

scanf中的%[^\n]%*c格式

scanf 语法: #include <stdio.h> int scanf( const char *format, ... ); 类似函数有 int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...);//指定输入流 int sscanf(const char *str, const char *for…

java有理数类的封装_java实验报告有理数的类封装.doc

java实验报告有理数的类封装华中科技大学文华学院《Java程序设计》实验报告实验三&#xff1a;有理数的类封装专业班级&#xff1a; 通信工程2008级1班姓名&#xff1a;学号&#xff1a;时间&#xff1a;实验三&#xff1a;有理数的类封装1、实验目的&#xff1a;让学生学习使用…

vim基本设置

vim基本配置&#xff1a;包括tab键替换成4个空格 Edit Vim configuration file ".vimrc" in your HOME directory, add below lines: [plain] view plaincopy set et set ci set sw4 set ts4 After new setting take effect, each time you press TAB key, …

在JPA和JDBC中使用存储过程。 嗯,只要使用jOOQ

Java杂志的当前版本由Josh Juneau撰写了有关JDBC和JPA的大数据最佳实践的文章&#xff1a; http : //www.javamagazine.mozaicreader.com/MayJune2016 本文介绍了如何在JDBC中使用存储过程&#xff08;不幸的是&#xff0c;请注意如何关闭资源。即使在Java Magazine的文章中&a…

java hash sha256_Sha256加密

package com.zq.utils.encryption;import java.util.Random;import org.apache.shiro.crypto.hash.Sha256Hash;import com.zq.utils.string.StringUtils;/**** Created by MyEclipse. Author: ChenBin E-mail: chenb8000056.com Date:* 2016-5-23 Time: 下午3:10:37 Company: H…

怎样花两年时间去面试一个人

Joel Spolsky曾经感叹&#xff1a;招聘难&#xff0c;难于上青天&#xff08;此处笔者稍加演绎:)&#xff09;。他有两个辛辣但不乏洞察力的断言&#xff1a;真正的牛人也许一辈子就投大概4次简历&#xff0c;这些家伙一毕业就被好公司抢走了&#xff0c;并且他们的雇主会给他们…

非网络引用element-ui css导致图标无法正常显示的解决办法

https://blog.csdn.net/m0_37893932/article/details/79460652 ******************************************** 前言 官方推荐的css及js引用方式如下: <!-- 引入样式 --> <link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-chalk/in…

Java EE与Java SE:Oracle是否放弃了企业软件?

Java Enterprise Edition是全球Java社区中最大的困惑来源之一。 就像《星球大战》和《星际迷航 》之间的区别一样&#xff0c;对于“原力觉醒”是他们在这部电影中看过的第一部电影的人来说。 奇怪的是&#xff0c;即使您有使用EE进行开发的经验&#xff0c;但整个情况通常仍然…

约瑟夫环

约瑟夫环是一个数学的应用问题&#xff1a;已知n个人&#xff08;以编号1&#xff0c;2&#xff0c;3...n分别表示&#xff09;围坐在一张圆桌周围。从编号为k的人开始报数&#xff0c;数到m的那个人出列&#xff1b;他的下一个人又从1开始报数&#xff0c;数到m的那个人又出列…

java链表的数据结构_Java数据结构 获取链表(LinkedList)的第一个和最后一个元素

Java数据结构 获取链表(LinkedList)的第一个和最后一个元素以下实例演示了如何使用 LinkedList 类的 linkedlistname.getFirst() 和 linkedlistname.getLast() 来获取链表的第一个和最后一个元素&#xff1a;Main.java 文件import java.util.LinkedList;public class Main {pub…

第二章:表单和模板

在第一章中&#xff0c;我们学习了使用Tornado创建一个Web应用的基础知识。包括处理函数、HTTP方法以及Tornado框架的总体结构。在这章中&#xff0c;我们将学习一些你在创建Web应用时经常会用到的更强大的功能。 和大多数Web框架一样&#xff0c;Tornado的一个重要目标就是帮助…

C语言main()函数详解

C的设计原则是把函数作为程序的构成模块。main()函数称之为主函数&#xff0c;一个C程序总是从main()函数开始执行的。一、main()函数的形式 在最新的 C99 标准中&#xff0c;只有以下两种定义方式是正确的&#xff1a;int main( void ) /* 无参数形式 */{...return 0;}int ma…

json套json_JSON –拯救杰克逊

json套json有时&#xff0c;您必须使用JavaScript从服务器中获取一些数据&#xff0c; JSON是完成此任务的不错选择。 让我们玩一下JPA揭秘&#xff08;第1集&#xff09;-OneToMany和ManyToOne映射中的Employer – Employee – Benefit示例。 我们将在基于Spring Framework的…

[洛谷P1951]收费站_NOI导刊2009提高(2)

题目大意&#xff1a;有一张$n$个点$m$条边的图&#xff0c;每个点有一个权值$w_i$&#xff0c;有边权&#xff0c;询问从$S$到$T$的路径中&#xff0c;边权和小于$s$&#xff0c;且$\max\limits_{路径经过k}\{w_i\}$最小&#xff0c;输出这个最小值&#xff0c;若到达不了&…

yii mysql 主从_mysql主从同步实践 YII

1、两台服务器互联master、slave 2、master配置&#xff1a; server-id 1 master端ID号 log-bin/data/logbin/mysql-bin 日志路径及文件名 #binlog-do-db cacti 同步cacti&#xff0c;此处关闭的话&#xff0c;就是除不允许的&#xff0c;其它的库均同步。 binlog-ignore-db …

性能与可靠性:Java应用为何像F1汽车

再想一想。 性能和可靠性相关吗&#xff1f; 还是这些东西相互排斥&#xff1f; 我认为是后者。 如今&#xff0c;现实是IT部门将应用程序的性能和可靠性视为同一事物&#xff0c;但这离事实还差得远。 让我们看看一级方程式车队如何管理性能和可靠性。 上赛季迈凯轮本田车队…

BZOJ[1051]受欢迎的牛

Description 每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛&#xff0c;给你M对整数(A,B)&#xff0c;表示牛A认为牛B受欢迎。 这种关系是具有传递性的&#xff0c;如果A认为B受欢迎&#xff0c;B认为C受欢迎&#xff0c;那么牛A也认为牛C受欢迎。你的任务是求出有多少…