美文网首页互联网技术栈云时代架构
使用Gradle编译Java工程之自定义Plugins篇

使用Gradle编译Java工程之自定义Plugins篇

作者: 云时代构架杨彪 | 来源:发表于2017-07-27 17:12 被阅读277次

文章目的

本章中我们将了解到如何自定义实现Gradle的插件(plugin)功能,并且亲自参与实现一个简单插件的全部过程。

需要准备

  • 一个熟悉的IDE开发工具
  • JDK 7及以上
  • Gradle 3.2以上

Gradle插件的介绍

Gradle插件功能可以很好的组织我们的编译逻辑代码,使它能在不同的项目和工程中重复使用。我们可以自定义实现自己的Gradle插件,然后分享给其他人使用。我们可以使用不同的语言来实现,不过本章中作者选择使用Groovy来实现的,大家也可以使用像java、scala等喜欢的别的语言来实现。Gradle自定义插件的实现和自定义任务类型非常的相似,而它两一般都是结合使用的。所以如果还不了解如何自定义任务类的小伙伴们可以先看看我之前的文章:使用Gradle编译Java工程之自定义Task类型篇

实现自定义的插件

首先有三种方式来编写我们的插件

  1. 在我们构建项目的build.gradle脚本中直接编写,这种方式的好处是插件会自动被编译加载到我们的classpath中,我们不需要额外做任何的事情,但是它有很明显的局限性,就是除了在包括它的脚本外别的地方无法复用。

  2. 在我们构建项目的rootProjectDir/buildSrc/src/main/groovy 目录下编写,Gradle会自动编译到当前项目的classpath中,该项目下所有编译脚本都可以使用该插件,但是除了当前项目之外的都无法复用。

  3. 以单独的工程方式编写,这个工程最终编译发布为一个JAR包,它可以在多个项目或不同的团队中共享使用。

我们首先使用第一种方式来实现一个简单插件(plugin)的例子。通过实现Plugin接口来实现自定义插件类,然后在需要使用的工程中调用Plugin.apply(T)方法来初始化和调用插件实例,同时工程(project )对象会作为一个参数传递给该插件,这样我们就可以在该自定义的插件中通过该工程对象来对工程进行相应的配置管理了。

接下来我们开始编写一个简单的HelloPlugin插件,其中只是简单的向工程中添加一个hello任务,代码如下:

apply plugin: HelloPlugin

class HelloPlugin implements Plugin<Project> {
    // 此方法接受一个Project对象
    void apply(Project project) {
        // 向project对象添加hello任务
        project.task('hello') {
            doLast {
                println "Hello from the HelloPlugin"
            }
        }
    }
}

然后执行命令gradle -q hello,其结果如下:

> gradle -q hello
Hello from the HelloPlugin

为自定义插件传递参数

像我们使用的大多数其他插件一样,我们可以接收一些自定义的参数,然后在Gradle脚本文件中配置使用这些参数。我们可以使用 extension objects来现实给插件传参,而每个Gradle工程都有一个ExtensionContainer对象,它可以保存我们为插件设置的属性值,具体实现看下面代码的注释:

apply plugin: HelloPlugin

// 使用闭包方式设置值
greeting {
    message = 'Hi'
    greeter = 'Gradle'
}

class HelloPlugin implements Plugin<Project> {
    // 此方法接受一个Project对象
    void apply(Project project) {
        // 向extension container保存greeting参数
        // 该greeting参数为HelloPluginExtension的实体bean
        project.extensions.create("greeting", HelloPluginExtension)
        // 向project对象添加hello任务
        project.task('hello') {
            doLast {
                println "${project.greeting.message} from ${project.greeting.greeter}"
            }
        }
    }
}

// 定义一个实体bean对象
class HelloPluginExtension {
    String message
    String greeter
}

然后执行命令gradle -q hello,其结果如下:

> gradle -q hello
Hi from Gradle

在一个独立的工程中实现自定义插件和任务

还是继续使用上一章中自定义任务的工程,使用IDEA打开该工程,新添加src/main/groovy/org/gradle/HelloPlugin.groovy文件,其代码如下:

class HelloPlugin implements Plugin<Project> {
    // 此方法接受一个Project对象
    void apply(Project project) {
        // 向extension container保存greeting参数
        // 该greeting参数为HelloPluginExtension的实体bean
        project.extensions.create("greeting", HelloPluginExtension)
        // 向project对象添加hello任务
        project.task('hello',type:GreetingTask) {
            // 设置greeting参数
            greeting = 'another project working!'

            doLast {
                println "${project.greeting.message} from ${project.greeting.greeter}"
            }
        }
    }
}

再添加src/main/groovy/org/gradle/HelloPluginExtension.groovy文件,其代码如下:

class HelloPluginExtension {
    String message
    String greeter
}

上面代码实现了自定义的插件类,但是Gradle又是如何找到我们的自定义插件呢?这就需要我们在工程的 resources 目录下建立 META-INF/gradle-plugins 文件夹,在其中新建helloPlugin.properties文件,其代码如下:

implementation-class=org.gradle.HelloPlugin

最终工程的结构如下,红框中为咱们新添加的文件:

图一 自定义插件工程结构

接下来发布工程到本地仓库,方法跟上一章的自定义任务类一样,在IDEA中直接运行publish任务。

最后在另外一个工程中使用该插件。使用IDEA开发工具新创建一个Gradle工程,在该工程中将使用我们上面自定义的插件,首先我们需要使用buildscript { } 块来使类添加到编译脚本的classpath中,下面build.gradle中的代码展示了如何加载本地仓库的插件:

buildscript {
    repositories {
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath group: 'org.gradle', name: 'customPlugin',
                version: '1.0-SNAPSHOT'
    }
}

// 应用自定义插件
apply plugin: 'helloPlugin'

// 为插件传递参数
greeting {
    message = 'Hello'
    greeter = 'gradle world'
}

执行命令gradle -q hello的结果如下,代表我们自定义的插件已经被成功加载了:

> gradle -q hello
another project working!
Hello from gradle world

小结

本章通过实现了一个自定义插件,并且结合自定义任务类一起使用。如果感觉兴趣的同学请关注我,我和朋友的新书《分布式服务架构:原理、设计与实战》也正式发布了,如果有需要的可以直接点击地址购买:http://m.china-pub.com/wxsc/book.aspx?id=6194188 ,或扫描以下二维码购买,数量有限多多支持哦。

签名版书哦

参加技术分享

相关文章

网友评论

    本文标题:使用Gradle编译Java工程之自定义Plugins篇

    本文链接:https://www.haomeiwen.com/subject/xwxtkxtx.html