上一篇Android使用FreeMarker制作代码模板中写道,利用FreeMarker来实现代码模板转换为java文件,这一篇将要描述如果通过插件将我们的FreeMarker工具类利用上。
1. 准备工作
在上一篇中所使用的项目的基础上进行更改,来实现通过利用Gradle插件自动生成java文件的功能。这里我使用的是Gradle-Plugins网站,通过这个网站,我们可以发布我们的插件应用。
1.1 首先,打开Module下的build.gradle文件,输入如下部分,创建groovy的语言环境:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
1.2 在mian文件夹下,创建一个文件夹,命名为groovy,创建完成后,android studio会自动识别。在groovy文件夹下创建我们的包名,这里我创建的包名与java文件夹下的包名一样,但不影响,如下图:1.3 实现插件。如下代码PluginImpl所示,其主要部分是使用project.afterEvaluate将任务插入到所有任务中:
package com.hu.freemarkerlib
import com.hu.freemarkerlib.bean.PluginBean
import org.gradle.api.Plugin
import org.gradle.api.Project
import java.io.File
import com.hu.freemarkerlib.task.FreeMarkerTask
public class PluginImpl implements Plugin<Project> {
void apply(Project project) {
println "Hello gradle plugin"
project.extensions.create('pluginImpl', PluginBean)
project.task("showName") << {
def pluginBean = project.extensions.pluginImpl
println("--------------------------------------------------------------------------------------")
println(pluginBean.outDirFile);
println(pluginBean.packageName);
println(pluginBean.clazzName);
println(pluginBean.id);
println(pluginBean.sex);
}
def freeMarkerTask = project.tasks.create("FreeMarkerTask", FreeMarkerTask)
project.afterEvaluate {
freeMarkerTask.execute()
}
}
}
然后在src/mian/resources/中创建文件夹META-INF/gradle-plugins/,在其下创建以.properties结尾的文件,名称任意,在文件中放入你的插件实现:
implementation-class=com.hu.freemarkerlib.PluginImpl
放入你的插件的路径的意义在于告知插件的位置所在。
2. 实现代码
FreeMarkerTask实现:
package com.hu.freemarkerlib.task
import com.hu.freemarkerlib.Generator
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class FreeMarkerTask extends DefaultTask {
FreeMarkerTask() {
super()
}
@TaskAction
def doAction() {
def pluginBean = project.extensions.pluginImpl
println("----------------------------------------***************************--------------------")
println(pluginBean.toString())
def daoGenerator = new Generator()
daoGenerator.generate(pluginBean.outDirFile,pluginBean.packageName, pluginBean.clazzName,pluginBean.id,pluginBean.sex,pluginBean.name)
}
}
其PluginBean的实现如下:
package com.hu.freemarkerlib.bean
class PluginBean {
private Integer id = 23;
private String name = 'Jeck';
private String sex = 'man';
private String clazzName = 'defaultClassName';
private String packageName = 'defaultPackage';
private String outDirFile = 'defaultDir';
Integer getId() {
return id
}
void setId(Integer id) {
this.id = id
}
String getName() {
return name
}
void setName(String name) {
this.name = name
}
String getSex() {
return sex
}
void setSex(String sex) {
this.sex = sex
}
String getClazzName() {
return clazzName
}
void setClazzName(String clazzName) {
this.clazzName = clazzName
}
String getPackageName() {
return packageName
}
void setPackageName(String packageName) {
this.packageName = packageName
}
String getOutDirFile() {
return outDirFile
}
void setOutDirFile(String outDirFile) {
this.outDirFile = outDirFile
}
@Override
public String toString() {
return "PluginBean{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", clazzName='" + clazzName + '\'' +
", packageName='" + packageName + '\'' +
", outDirFile='" + outDirFile + '\'' +
'}';
}
}
- 添加发布插件配置信息
在Gradle-Plugins网站中可以了解到如何配置你的插件,这里贴出主要部分:
// First, apply the publishing plugin
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "com.gradle.publish:plugin-publish-plugin:0.9.10"
}
}
apply plugin: "com.gradle.plugin-publish"
// Unless overridden in the pluginBundle config DSL, the project version will
// be used as your plugin version when publishing
version = "0.15"
group = "com.hu.freemarkerlib"
// The configuration example below shows the minimum required properties
// configured to publish your plugin to the plugin portal
pluginBundle {
website = 'https://github.com/RaysHuch/'
vcsUrl = 'https://github.com/RaysHuch/FreeMarkerDemo'
description = 'Use FreeMarker for android and gradle'
tags = ['freeMarkerPlugin']
plugins {
greetingsPlugin {
id = 'com.hu.freemarkerlib'
displayName = 'Gradle Greeting plugin'
}
}
}
在此同时,需要在C:\Users${电脑用户名}.gradle\gradle.properties中放入你的key和secret:
gradle.publish.key=************************************
gradle.publish.secret=*************************************
进行了以上操作后,你就可以将你的插件发布的网站中了,有时需要科学上网。
在你的项目中你会发现有如下变化:
首选需要点击login的task,在Console中将会看到:
这里需要你点击一下链接,之后会出现成功的字样(当然是英文)。
到了最后一步,点击你的publishPlugins的Task,将你的插件发布,这样你的插件就真真正正可以使用了!
3、使用插件
插件的使用也是相当简单,按照如下配置,你的项目就可以起飞了:
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "gradle.plugin.com.hu.freemarkerlib:FreeMarkerLib:0.15"
}
}
apply plugin: "com.hu.freemarkerlib"
4. 结语
由于是第一次使用插件,创建插件还是蛮简单的,但怎么执行Task就成了老大难的问题,一开始认为,直接在Plugin的apply方法中调用你的Java代码就可以了,说的没错,确实能够顺利执行,让我一度很兴奋,终于插件能跑了。但是,当我实现从build.gradle文件中读取配置信息的时候就面临了问题,无论怎样都不会读取到所写的配置信息,各种搜索才知道,需要在project.afterEvaluate中执行你的Task,build.gradle所配置的信息才会真正的加载运行环境里。
传送门: