参考资料:https://blog.csdn.net/wjcommen/article/details/105295696
buildSrc方式实现
适合在同一个project中使用
1.首先创建new 一个java or kt library。名字使用buildSrc。如果提示buildSrc是保留项目(‘buildSrc’ cannot be used as a project name as it is a reserved name.)只需要在工程根目录中的settings.gragle中将“include ':buildSrc'’”删除,重新编译即可。
buildSrc下的build.gradle内容
plugins {
id 'java-library' //默认创建就会有
id 'java-gradle-plugin' //用来发布插件id使用的
}
repositories { //来提供java的开发API 以及下面的dependencies 可以从根目录的build.gradle中复制过来
google()
jcenter()
}
dependencies {//同上
implementation gradleApi()
implementation "com.android.tools.build:gradle:4.0.2"
}
java {//系统生成的
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
gradlePlugin{//用来发布plugin的
plugins{//插件
xxx{//命名任意
id ="com.kalerm.test" //这个id就是外面引用时使用的
//这个必须指向真实的plugin类。参见下图
implementationClass ="com.kalerm.buildsrc.MyPlugin"
}
}
}
必须路径正确指向project开始入口.png
当引用提供的pluginid时,会依赖implementationClass 来找到真实的插件入口。至此,点击build后,可以看到自动生出了下图
image.png
MyPlugin.java
package com.kalerm.buildsrc;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
public class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project target) {
target.getExtensions().create("user",Person.class);
target.afterEvaluate(new MyAction());
}
}
主项目build.gradle
//引入插件的id
apply plugin: 'com.kalerm.test'
//写入extensions的属性。user与MyPlugin中create的字段相同。
user {
name "某某某"
age 99
ok true
}
Person.java类
需要注意的是,这个类应该是个data(KT中的)类。需要有get/set方法。app主项目build下的配置值,是通过反射get/set来赋值的。特别需要注意的就是isxx之类的属性,如果找不到,多半是命名/驼峰命名问题引起的。
public class Person {
String name;
int age;
boolean ok;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isOk() {
return ok;
}
public void setOk(boolean ok) {
this.ok = ok;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", ok=" + ok +
'}';
}
}
MyAction.java
public class MyAction implements Action<Project> {
@Override
public void execute(Project project) {
Person user = (Person) project.getExtensions().findByName("user");
if (user != null) {
System.out.println(user.toString());
}else {
System.out.println("傻逼了");
}
}
}
Action中findByName使用的就是plugin中create的。测试发现,如果你的plugin中create的与app下build中配置的字段不同,会提示编译不过。
执行编译就可以看到输出结果了
网友评论