1.准备工作
使用java开发gradle插件,基于gradle7.0版本开发,所以一些gradle的API针对低版本已经发生了变化。
1.1创建一个Android module
创建Android模块GradlePlugin,删除掉res和androidTest这两个目录,
在main目录下创建resources/META-INF/gradle-plugins目录
接着在其目录下创建xxx.properties,其中xxx为插件的id,这里我们使用com.example.gradleplugin.properties
1.2准备maven环境
这里我们需要构建maven环境,将GradlePlugin打包成jar包,push到本地的maven库当中,然后在新的模块当中引用
apply plugin: 'java'//导入java插件用于,编译打包我们的插件
apply plugin: 'maven-publish'//maven插件,用于上传插件到仓库
publishing {
publications {
maven(MavenPublication) {
groupId "com.example.gradleplugin"
artifactId "GradlePlugin"
version "1.3"
//如果是war包填写components.web,如果是jar包填写components.java
from components.java
}
}
repositories {
maven {
url = "file://${rootDir}/maven"
}
}
}
dependencies {
//导入Gradle的api,要写插件需要用到
implementation gradleApi()
}
2.实现插件
2.1实现插件类
这里我们实现一个往文件里面写入信息的插件。
首先创建一个Student实体类
public class Student {
private String name;
private int age;
public Student(String name, int age){
this.name = name;
this.age = age;
}
@Input
public String getName() {
return name;
}
@Input
public int getAge() {
return age;
}
@Override
public String toString() {
return "你好!"+age+" years old "+name+" !";
}
}
然后创建一个写入Student的task,WriteStudents继承了DefautTask,实现了能够将student写入文件的功能。
public class WriteStudents extends DefaultTask {
private Student stu;
private File targetDirectory;
private String fileName;
@Nested
public Student getStu() {
return stu;
}
@OutputFile
public File getTargetFile() {
return new File(targetDirectory, fileName);
}
@Input
public String getFileName() {
return fileName;
}
@InputDirectory
public File getTargetDirectory() {
return targetDirectory;
}
@TaskAction
public void writeObject() {
File targetFile = new File(targetDirectory, fileName);
try {
FileOutputStream fos = new FileOutputStream(targetFile);
byte[] bytes = stu.toString().getBytes();
fos.write(bytes);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void setStu(Student stu) {
this.stu = stu;
}
public void setTargetDirectory(File targetDirectory) {
this.targetDirectory = targetDirectory;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
接着再创建一个HelloWorldPlugin插件,继承自Plugin,再apply方法里面创建了zzzHello task。
package com.example.gradleplugin;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import java.io.File;
public class HelloWorldPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
WriteStudents task = project.getTasks().create("zzzHello", WriteStudents.class);
task.setFileName("HelloWorld.txt");
task.setStu(new Student("张三",20));
task.setTargetDirectory(new File("/Users/rdm/Downloads/project/demo/GradlePluginTest2"));
task.setGroup("hello");
}
}
2.2编辑properties文件
在com.example.gradleplugin.properties文件当中插入如下代码,关联上插件具体的实现类
implementation-class=com.example.gradleplugin.HelloWorldPlugin
2.3发布插件
执行publish任务,将插件发布到本地的maven仓库
3.应用插件
3.1引入插件
在setting.gradle里面增加maven仓库,在根build.gradle里面增加maven仓库和classpath,
在需要的模块build.gradle里面引入插件
3.2应用插件
引入完成之后,build一下工程,在gradle的栏目下就可以看到我们刚才增加的task
执行zzzHello,可以发现文件已经写入了
参考:https://www.jianshu.com/p/3c59eded8155