Gradle自定义插件

本教程介绍了创建Gradle独立自定义插件的方法。 它涵盖以下主题
  • 创建任务,并在“自定义”插件中使用它
  • 独立的自定义插件
  • 简短的插件ID
  • 使用settings.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自定义插件
摇篮版本: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对象,该对象有助于跟踪传递给插件类的所有设置和属性。 让我们定义一个扩展类,它可以容纳参数并将其传递给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

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

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

相关文章

mysql映射文件_Mybatis SQL映射文件

简单查询insert添加insert可以使用数据库支持的自动生成主键策略&#xff0c;设置useGeneratedKeys”true”&#xff0c;然后把keyProperty 设成对应的列&#xff0c;就搞定了。比如说上面的StudentEntity 使用auto-generated 为id 列生成主键.还可以使用selectKey元素。下面例…

监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法

在实际的应用中&#xff0c;我们常常需要实现在移动app和浏览器中点击返回、后退、上一页等按钮实现自己的关闭页面、调整到指定页面或执行一些其它操作的 需求&#xff0c;那在代码中怎样监听当点击微信、支付宝、百度糯米、百度钱包等app的返回按钮或者浏览器的上一页或后退按…

第七天作业

---恢复内容开始--- 作业一&#xff1a;nginx服务 二进制安装nginx包 作为web服务修改配置文件 让配置生效&#xff0c;验证配置 直至出现epel的两个文件&#xff0c;否则reinstall, 接下来写配置文件&#xff0c; 这款软件的服务目录&#xff0c; 在里面编辑一些东西&#xff…

Java测试提示

介绍 我喜欢自动化测试。 在一次极少的转移到op-ed 1中&#xff0c;我想到了一些想法&#xff08;阅读–意见&#xff09;。 在开始如何最好地构成您的测试之前&#xff0c;我先简单问一下–测试的原因是什么&#xff1f; 大致来说&#xff0c;我认为它们是&#xff1a; 减少…

pdo mysql fedora_在Fedora 23 Server和Workstation上安装LAMP(Linux, Apache, MariaDB和PHP)

在安装LAMP之前&#xff0c;建议先更新系统包$ sudo dnf update第一步&#xff1a;安装Apache Web服务器1.在Fedora 23安装Apache&#xff0c;你可以运行下面的命令&#xff1a;$ sudo dnf install httpd2.安装完成后&#xff0c;我们设置在系统启动时自动启动Apache&#xff0…

洛谷P1937 [USACO10MAR]仓配置Barn Allocation

题目描述 Farmer John recently opened up a new barn and is now accepting stall allocation requests from the cows since some of the stalls have a better view of the pastures. The barn comprises N (1 < N < 100,000) stalls conveniently numbered 1..N; sta…

人脸数据库大全(包括人脸识别、关键点检测、表情识别,人脸姿态等等)

搞计算机视觉的人&#xff0c;对人脸技术并不陌生。在做实验的时候需要各种数据集进行训练&#xff0c;却往往苦于找不到合适的数据集&#xff0c;这篇文章将给大家带来一点福音。 目前为止最全的是人脸数据库总结&#xff1a; The Color FERET Database, USA The FERET progra…

JavaFX游戏(四连环)

这是我的第一个JavaFX游戏教程&#xff0c;也是我关于JavaFX面板的第一篇博客文章。 我仅用200几行代码就完成了这款四连环游戏&#xff0c;足以应付一个简单的游戏。 我在这里使用GridPane面板对磁盘进行布局&#xff0c;GridPane是JavaFX布局窗格之一&#xff0c;但它与另一个…

vs使用了未初始化的局部变量怎么解决_C程序为什么要初始化?

作者:守望,Linux应用开发者,目前在公众号【编程珠玑】 分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源。 前言 什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题。 什么是初始化 初始化…

maven 配置 pom.xml 打包生成:单jar包/jar包+lib目录

http://www.jianshu.com/p/9146cec6cc60转载于:https://www.cnblogs.com/Baronboy/p/7510942.html

zabbix安装MySQL失败_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...

本文主要向大家介绍了MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。如题所示&#xff0c;在CentOS6.x的系统中安装zabbix3.x&#xff…

拼图项目:延期的后果

Mark Reinhold先生于2012年7月宣布 &#xff0c;他们计划从Java 8撤回Jigsaw项目 &#xff0c;因为Jigsaw计划于2013年9月&#xff08;从现在开始一年&#xff09;推迟其发布。 这个日期是众所周知的&#xff0c;因为Oracle已决定实施Java的两年路线图计划&#xff0c;因此2013…

Navicat下Oracle数据泵的使用简单例子

如何使用Navicat等数据库开发工具进行高效开发将是未来工作的重点。Navicat一来美观而来够操作够傻瓜&#xff0c;使用得当其强大功能与PL SQL不相上下。今天学习就是如何在Navicat中使用数据泵进行数据导入导出。 数据泵使用前事项&#xff1a;想使用数据泵必须以sys或system等…

前端自动化之nvm安装

nvm ——node环境版本控制工具。 1.解压安装包 2.打开setting文件&#xff0c;修改文件内容 root: D:\node\nvm path: D:\node\nodejs arch: 64 proxy: root&#xff1a;当前nvm所在的路径 path&#xff1a;将root路径的nvm改为nodejs arch&#xff1a;64位系统 3.配置环境变量…

mysql 主从复制介绍_MySQL 主从复制介绍

一、MySQL 主从复制简介(1) MySQL 主从复制通过逻辑的 binlog 日志复制到要同步的服务器本地&#xff0c;然后由本地的线程读取日志里面的 SQL 语句&#xff0c;重新应用到 MySQL 数据库中(2) 在复制过程中&#xff0c;一台服务器充当主服务器&#xff0c;接收来自用户的内容更…

【Java面试题】18 java中数组有没有length()方法?string没有lenght()方法?下面这条语句一共创建了多少个对象:String s=a+b+c+d;...

数组没有length()这个方法&#xff0c;有length的属性。String有有length()这个方法。 int a[]; a.length;//返回a的长度 String s; s.length();//返回s的长度 java中数组没有length()方法&#xff0c;求数组的长度可以使用数组的length属性。 int[] arr{1,2,3,4,5};int length…

Spring范围代理

考虑以这种方式定义的两个Spring bean&#xff1a; Component class SingletonScopedBean{Autowired private PrototypeScopedBean prototypeScopedBean;public String getState(){return this.prototypeScopedBean.getState();} }Component Scope(value"prototype")…

递归和分治的概念性的理解

递归的概念表述&#xff1a; 直接或间接调用自身的算法称为递归算法。 理解&#xff1a;递归算法的可以理解为多个算法的嵌套调用&#xff0c;只是调用算法是同一个&#xff0c;同时需要一个工作栈来作为各层次的数据存储区&#xff0c;包括所有实参指针&#xff0c;局部变量&a…

ibatis mysql sqlmapconfig_iBATIS sqlMapConfig配置详解

1 <?xml version"1.0" encoding"UTF-8"?>2 "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">5 6 11 13 enhancementEnabled"true"14 lazyLoadingEnabled"true"15 errorTracingEnabled"true"16 m…

什么情况使用 weak 关键字,相比 assign 有什么不同?

什么情况使用 weak 关键字&#xff1f; 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性 自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak&#xff1b;当然…