您的当前位置:首页正文

开发Gradle插件并上传至本地maven库

2024-11-20 来源:个人技术集锦

        本文章向大家介绍开发Gradle插件并上传至本地maven库,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

        作为一个Android开发者,知道gradle是用来构建Android项目的,一开始在学校的时候,没怎么关注并使用过gradle,现在工作发现gradle配置、插件等等,是一个很强大的工具。因此就开始了学习之路,这边介绍一下如何使用idea开发一个Gradle插件并将其上传至本地maven库,这样本地就可以使用这个插件了。

Gradle插件是什么

我们初创一个Android项目,其中每个module的build.gradle文件顶部有这样一行代码:

apply plugin:'com.android.application'

这里com.android.application就是一个gradle插件,它用来编译Android项目,因为原生的gradle并不是用来构建android项目的,因此谷歌实现了一个构建android的插件。 那么gradle项目本身支持的插件有:java、groovy、scala、maven等等。

开发gradle插件

由于我们项目中经常需要在构建过程中一些操作,比如aop,在apk生成后加固等等,因此开发了一些gradle插件来完成这样的事情。那么开发一个gradle插件的流程如下:

gradle init --type groovy-library

将生成的build.gradle文件改成以下内容:

buildscript {
    repositories {
        maven { url 'http://jcenter.bintray.com' }
    }

    dependencies {
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:0.6'
    }
}

plugins {
    id 'groovy'
    id 'idea'
    id 'maven'
    id 'maven-publish' //该插件可以将打包的jar发送到maven库
}

repositories {
    jcenter()
    mavenCentral()
}

dependencies {
    compile localGroovy()
    compile gradleApi()
}

publishing{
    publications{
        plugin(MavenPublication){
            from components.java
            group 'com.xingfeng'
            artifactId 'firstplugin'
            version '1.0.0'
        }

    }

}

这里我们开发的gradle插件是一个二进制插件,别人如果想使用,和类库是一样的,需要提供group:artifactId:version,publishing{}标签里的就是上传至本地仓库时的版本信息。 使用本地配置的gradle和groovy版本;

  1. 创建文件结构 在src/main/groovy目录下创建包名,插件类。 在main目录下创建resources/META-INF/gradle-plugins目录,创建插件对应的配置文件,如下图所示:

其中配置文件的红色部分就是该插件的id,上面介绍的Android Plugin的id是"com.android.application",其内容如下:

implementation-class=com.xingfeng.FirstPlugin

key是implementation-class,值就是插件名,包含全限定名。

  1. 开发插件;
package com.xingfeng;

import org.gradle.api.Plugin
import org.gradle.api.Project

class FirstPlugin implements Plugin<Project>{

    @Override
    void apply(Project project){
        println 'hello world'
    }

}
  1. 发布插件;开发完就可以执行publishToMavenLocal任务,将插件打包发布到本地Maven库。
gradle publishToMavenLocal

使用插件

使用插件,首先需要在buildscript{}里加上仓库和classpath,

buildscript {
    repositories {
        mavenLocal()
    }
    dependencies {
        classpath 'com.xingfeng:firstplugin:1.0.0'
    }
}

然后可以在项目的gradle文件中加入:

apply plugin:'com.xingfeng.firstplugin'

执行gradle build命令,可以看到打印出了hello world字样。

自动化shell脚本

上面的流程可以发现很多都是机械性的操作,作为一个程序员,不能容忍这些事情的发生,决定写一个程序将其自动化,然后再手动修改某些地方就ok了。本来决定用java写的,不知道怎么回事,执行命令总不成功,后来就转成shell脚本了。

环境要求

mac、groovy、maven、java

shell脚本

DIR=$1
PLUGINNAME=$2

mkdir ${DIR}
cd ${DIR}
gradle init --type groovy-library

#修改build.gradle
rm build.gradle
echo "buildscript{" >> build.gradle
echo "repositories{" >> build.gradle
echo "maven{url 'http://jcenter.bintray.com'}" >> build.gradle
echo "}n" >> build.gradle
echo "dependencies{" >>build.gradle
echo "classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:0.6'" >> build.gradle
echo "}n}n" >> build.gradle
echo "plugins{" >> build.gradle  
echo "id 'groovy'" >>build.gradle
echo "id 'idea'" >>build.gradle
echo "id 'maven'">>build.gradle
echo "id 'maven-publish'">>build.gradle  
echo "}n" >>build.gradle  
echo "repositories{">>build.gradle
echo "jcenter()">>build.gradle
echo "mavenCentral()}">>build.gradle
echo "dependencies{">>build.gradle
echo "compile localGroovy()">>build.gradle
# echo "testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'">>build.gradle
echo "compile gradleApi()">>build.gradle
echo "}n">>build.gradle
echo "publishing{">>build.gradle
echo "publications{">>build.gradle
echo "plugin(MavenPublication){">>build.gradle
echo "from components.java">>build.gradle
echo "group 'xxxxxx'">>build.gradle
echo "artifactId 'xxxx'" >>build.gradle
echo "version 'xxxx'">>build.gradle
echo "}n}n}">>build.gradle

#删除test目录
cd src
rm -r -f test


#创建plugin class
cd main
echo "import org.gradle.api.Plugin">>groovy/${PLUGINNAME}.groovy
echo "import org.gradle.api.Project">>groovy/${PLUGINNAME}.groovy
echo "class ${PLUGINNAME} implements Plugin<Project>{">>groovy/${PLUGINNAME}.groovy
echo "@Override">>groovy/${PLUGINNAME}.groovy
echo "void apply(Project project){">>groovy/${PLUGINNAME}.groovy
echo "}n}">>groovy/${PLUGINNAME}.groovy

rm groovy/Library.groovy


#创建resources目录
mkdir -p resources/META-INF/gradle-plugins
cd resources/META-INF/gradle-plugins
echo 'implementation-class=xxxxxxxx' > xxxxxx.properties

运行

这里举个例子:

sh plugintemplate.sh Test FirstPlugin

运行结果如下:

总结

GradlePluginTemplate 详细X

显示全文