Java的Gradle插件实现
- 在AS (Android Studio)中创建module, 删除除src/main目录和build.gradle以外的所有文件
- 在src/main目录下创建java和resources目录
- 在java目录下创建包名,并编写Java语言的插件代码
- 在resources目录下创建META-INF/gradle-plugins目录
- 在META-INF/gradle-plugins目录下创建xxx.properties文件, 其中xxx是要发布的插件名称: com.jeff.plugin.JeffPlugin.properties, 该名字就是引用该插件时使用的名字
- xxx.properties文件内容是:
implementation-class=com.jeff.plugin.MyPlugin
, 指向插件的具体实现
package com.jeff.plugin;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import groovy.lang.Closure;
public class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
// 创建一个新的Task
project.task("jeff", new Closure(this) {
// Gradle配置阶段(初始化)调用
public void doCall() {
System.out.println("create a new task named jyan");
}
}).doLast(new Closure(this) {
// Gradle执行阶段调用
public void doCall() {
System.out.println("doLast");
}
});
System.out.println("hello java plugin");
// 将新创建的Task(jeff)添加到Build构建任务的最后, 这样可以在build完成之后通过该Task做一些事情
project.getTasks().findByName("build").doLast(new Closure(this) {
public void doCall() {
((AbstractTask)project.getTasks().findByName("jyan")).execute();
}
});
}
}
插件发布
方法一
apply plugin: 'java'
apply plugin: 'maven'
dependencies {
implementation gradleApi()
}
repositories {
jcenter()
mavenCentral()
}
group = 'com.jeff.plugin'
version = '1.0.0'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('/home/jeff'))
}
}
}
然后在项目根目录执行./gradlew uploadArchives后, 就会将jar包发布在/home/jeff/com/jeff/…目录下.
注意如果com.jeff.plugin.JeffPlugin.properties名字不包含JeffPlugin, 发布的插件在引用时使用项目名称
方法二
apply plugin: 'java'
apply plugin: 'maven-publish'
dependencies {
implementation gradleApi()
}
repositories {
jcenter()
mavenCentral()
}
publishing {
publications {
mavenJava(MavenPublication) {
groupId 'com.jeff.plugin'
artifactId 'jeffPlugin'
version '1.0.0'
from components.java
}
}
repositories {
maven {
url uri('/home/jeff/repos')
}
}
}
然后在项目的根目录执行./gradlew publish就会发布插件, 发布的插件放在了/home/jeff/repos/com/jeff/…目录下.
引用时直接使用xxx.properties文件的名字即可
插件的引用
在工程目录的build.gradle中添加引用的路径和classpath
repositories {
// 添加插件库所在的路径
maven {
url uri('/home/jeff/repos')
}
google()
jcenter()
}
dependencies {
// 添加依赖的插件名称及版本
classpath 'com.jeff.plugin:jeffPlugin:1.0.0'
}
在模块(module)的build.gradle引用插件
// 在模块的build.gradle文件开头引用插件
apply plugin: 'com.jyan.plugin.JYanPlugin'
在引用该插件的模块中将自定义task添加到build过程中
1. 在build.gradle中将Task添加到build任务序列之前
preBuild.dependsOn(jeff)
2. 在build.gradle中将Task添加到build任务序列之后
afterEvaluate {
def buildTask = project.tasks.findByName('build')
if (buildTask == null) {
throw new GradleException("the build task is not found")
}
buildTask.doLast {
jeff.execute()
}
}
也可以在插件代码中直接添加某个执行任务序列中, 请参考插件代码的最后一段代码