自定义Gradle插件可以将常用的任务封装起来,简化使用。
环境准备
- IDEA 一份 + JDK
- Gradle Distribution 一份,尽量4.0+
1. 首先使用IDEA创建Java&Gradle工程
- 得到正确的文件目录结构,如
src/main/java
- 得到一份初始的build.gradle文件
2. 使用相关帮助插件
编写插件需要一个帮助插件和一个发布插件,还会用到Gradle相关的Api,我们将其添加到gradle文件中:
buildscript {
repositories {
maven {
// plugin-publish-plugin插件的地址
url("https://plugins.gradle.org/m2/")
}
mavenCentral()
}
dependencies {
classpath "com.gradle.publish:plugin-publish-plugin:0.9.9"
}
}
// 发布插件,待会儿发布我们的插件时用到
apply plugin: "com.gradle.plugin-publish"
// 帮助插件,用来配置我们自己的插件信息
apply plugin: 'java-gradle-plugin'
repositories {
mavenCentral()
}
dependencies {
// 依赖Gradle相关Api
compile gradleApi()
}
group 'com.lxj.plugindemo'
version '0.0.1'
3. 编写插件内容
- 在
src/main/java
目录下创建包com.lxj.plugindemo
,编写一个自定义Task:
public class Hello extends DefaultTask{
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
// when you run task, this method will be executed.
@TaskAction
void sayHello() {
System.out.printf("%s, %s!\n", getName(), getAge());
}
}
- 将Task注册到当前Project中,需要编写一个类继承Plugin类:
public class HelloPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
//you add a task named 'hello'.
project.getTasks().create("hello", Hello.class, (task) -> {
//you can set something to task.
task.setName("Hello");
task.setAge("World");
});
}
}
当然我们可以借助官方已有的很多task,比如copy文件来完成我们的功能。假设插件已经写完,那么如何发布呢?
4. 配置Auth Key,如果要将插件发布到官方仓库,需要先在Gradle网站[https://login.gradle.org/user/login]注册一个账户,然后获取自己的Api Key,将这2行api key放到c:/users/xxx/.gradle/gradle.properties
文件zhong
5. 发布插件到官方PluginPortal[https://plugins.gradle.org/]
我们已经使用了发布插件的库,只需要配置一些东西,在gradle末尾添加:
gradlePlugin {
plugins {
helloPlugin {
id = 'com.lxj.plugindemo'
implementationClass = "com.lxj.plugindemo.HelloPlugin"
}
}
}
pluginBundle {
website = 'https://www.github.com/li-xiaojun'
vcsUrl = 'https://www.github.com/li-xiaojun'
plugins{
helloPlugin {
id = 'com.lxj.plugindemo'
displayName = 'HelloPlugin'
description = 'Just for learn!'
tags = ['aaa', 'bbb', 'ccc']
version = project.version
}
}
}
注意事项
- 插件代码中不能有中文,否则会编译出错。
网友评论