徒手撸一个gradle插件

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文件当中插入如下代码,关联上插件具体的实现类

扫描二维码关注公众号,回复: 14641913 查看本文章
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

猜你喜欢

转载自blog.csdn.net/hbdatouerzi/article/details/122378947