文章目录

  • 一、前言
  • 二、环境版本
  • 三、代码
  • 四、插件使用
  • 五、参考链接


一、前言

上一篇记录了使用buildSrc的方式创建gradle插件,但是这种方式只能当前项目的不同模块使用。所以如果将代码发布到云端就可以使大家都可以使用了,这种方式大家通常使用maven或者ivy,不过目前使用maven的居多。maven不仅可以发布到云端也可以发布到本地供不同的项目使用。由于云端需要创建各种账号,比较繁琐,这里仅记录如何发布到本地。以后想修改成云端发布时候,只需要填写上地址和账号即可。

二、环境版本

该代码是在Mac上进行开发的,不过这个不重要,这里记录下主要的开发环境版本

Android Studio: Android Studio Arctic Fox | 2020.3.1 Patch4
gradle: 7.0.2
android_gradle: 7.0.4

三、代码

该插件的创建方式是通过在一个Android 项目中创建的(其实更应该是单独创建一个插件项目而不是这种方式,不过该方式可以做到很方便的测试)。其整体结构目录如下:

gradle 配置maven私服的地址 gradle maven插件_android

这里代码主要放在java目录下面。采用java语言编写,而不是groovy。具体原因稍后解释。

java包下面是定义的包名,所以plugin可以写成自己想要定义的包名。

test-gradle.properties该文件名可以随便定义,名字可以用来在后面引用插件。

将该模块添加进项目根目录的settings.gradle中。其中代码定义如下:

settings.gradle

dependencyResolutionManagement {
//    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenLocal()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
        maven { url 'https://jitpack.io' }
    }
}
rootProject.name = "My Application"
include ':app'
include ':lib'
include ':test-plugin'

其中需要注意要注释掉以下代码:

repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)

然后打开test-plugin/build.gradle文件。其内容如下:

build.gradle

plugins {
    id 'maven-publish'
    id 'java-library'
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "com.android.tools.build:gradle:7.0.4"
    implementation gradleApi()
    implementation localGroovy()
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10"
}

publishing {
    publications {
        maven(MavenPublication) {
            groupId = 'com.test.plugin'
            artifactId = 'ym'
            version = '1.0.0'
            from components.java
        }
    }

    repositories {
        maven {
            // change to point to your repo, e.g. http://my.org/repo
            url = layout.buildDirectory.dir('repo')
        }
    }
}

java {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}
sourceSets {
    main {
        java {
            srcDir 'src/main/java'
        }
//        groovy {
//            srcDir 'src/main/groovy'
//        }
 //        resources {
//            srcDir 'src/main/resources'
//        }
    }
}

这里需要注意sourceSets里面注释的函数,这两个函数表示是不存在的,所以如果像之前那样定义groovy是无法找到里面的文件的。所以是不能定义groovy文件。

打开test-gradle.properties,定义以下内容,该内容表示了插件入口:

其内容为包名+类名

implementation-class=plugin.TestPlugin

定义完后可以build下程序以便在编写代码时候可以使用代码联想功能。接下来定义插件内容

TestPlugin.java

package plugin;

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

class TestPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        System.out.println("打印的第四种方式-test");
    }
}

编写完毕后重新build项目,然后进行发布到本地。

打开右侧Gradle窗口执行pubilsh任务。如下图所示:

gradle 配置maven私服的地址 gradle maven插件_gradle 配置maven私服的地址_02

如果选择...ToMAvenLocal来发布的话则会发布到本地,这样mavenLocal()函数就可以使用了,否则只是使用pubilsh的话,只会执行自己编写的发布方式,比如该文的发布到repo文件夹中,如果要使用这里的话需要在maven仓库中指定插件查找位置

这样插件就发布完成了。

四、插件使用

插件发布完成就可以使用了,这里还在这个项目中进行使用。

打开项目根目录下build.gradle文件进行引入插件。代码如下所示:

build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        mavenCentral()
        mavenLocal()//该仓库主要是引入本地插件的仓库。一般本地发布的插件就会通过这个方式进行引入
        maven { url 'https://jitpack.io' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.0.4'
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10'
        classpath 'com.test.plugin:ym:1.0.0' 
    //该命名规则是通过插件里面build.gradle里面的publications中定义的属性进行编写

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

然后在app/build.gradle中进行使用插件。如下:

build.gradle

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'test-gradle' //该名字就是之前定义的test-gradle.properties的文件名
}

android {
    ...
    ...
}

然后重新build文件,会看到编译过程中打印出插件中定义的日志

如果上文还有不太了解的或者遇到来其它问题,可以仔细月底参考链接的前三篇文章:

由于该内容在开发过程中较为复杂,所以将代码上传至github上以供参考:
https://github.com/mayangming/gradlePluginTest/tree/master