一、前言
无论是前端、后端、还是APP端,一个项目随着功能需求的迭代、人员团队的规模扩张与流动,使得项目越来越臃肿,IDE的性能也几何下降,代码耦合严重,维护性变差,编译更加耗时等。
这时,大家就会想出代码抽象与拆分,模块化、组件化、微服务化等方向演进发展;拆解完后,就希望能以Library的方式提供给使用方而不是源码,因此,Maven / JCetner等包管理工具就出世了。
二、包管理仓库
Android项目第三方库的依赖一般有三种:
- 本身工程中的 Module 依赖(implemention project(':xxxx'));
- 本地 libs 依赖:放置于 "./Module/libs/" 下;
- 远程库依赖:基于第三方中央仓库;
Android 有三个中央仓库可使用:
- Maven
- JCenter
这些都是公网仓库,全球可用,但出于一些公司考虑,也会在企业内部搭建私服,如下图:

三、基于Maven的Gradle通用发布脚本
3.1、Maven基本知识
我们先来看看一个包的pom文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.chris.aop</groupId>
<artifactId>aop-asm-gradle-plugin</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>9.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-commons</artifactId>
<version>9.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.android.tools.build</groupId>
<artifactId>gradle</artifactId>
<version>3.5.0</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<name>com.chris.aop:aop-asm-gradle-plugin</name>
<url>https://github.com/qingye/AndroidAOPDemo</url>
<description>android aop</description>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>qingye</name>
</developer>
</developers>
<scm>
<url>https://github.com/qingye/AndroidAOPDemo</url>
</scm>
</project>
POM文件其实就是一个XML文件,最核心也是最基本的内容需要包含:
- project标签,以及指定的协议:xmlns 和 xsi;
- xml文档版本;
- groupId、artifactId、version:这三者才能绝对定位一个包
- 一个 groupId 可以有多个 artifactId;
- 一个 artifactId 可以有多个版本;
- dependencies:该发布包所需要的依赖信息;
- licenses:使用方使用该包需满足的法律协议;
- developers:开发者信息;
- scm:源码仓库地址;
还可以有其它额外信息,但以上信息是发布一个包必需包含的信息。
3.2、maven-publish 插件
该插件能够帮助我们对 Module 进行打包,生成 POM 文件,并发布到本地指定的目录下,我们先来看看,使用了该插件后,会在Gradle面板中出现以下几条选项:

在 Gradle 的 Tasks 中,有个 publishing 的 Task,下面有许多可供我们打包发布,或生成 Metadata / Pom 的文件。
3.3、通用 Maven 脚本 For Java
3.3.1、定义 POM 通用配置文件
// 在项目根目录/gradle目录下新建:
// project-mvn-config.gradle 文件,内容如下:
ext {
GROUP = 'com.chris.aop'
VERSION_NAME = "${VERSION}"
PROJECT_URL = 'https://github.com/qingye/AndroidAOPDemo'
ISSUES_URL = "${PROJECT_URL}/issues"
BINTRAY_LICENCE = ['Apache-2.0']
BINTRAY_ORGANIZATION = "qingye"
LICENSE = [
NAME: "The Apache Software License, Version 2.0",
URL : "http://www.apache.org/licenses/LICENSE-2.0.txt"
]
DEVELOPER = [
ID : "",
NAME : "qingye",
EMAIL: "24854015@qq.com"
]
SCM = [
URL : "${PROJECT_URL}",
COMMIT: ""
]
}
3.3.2、其它全局配置(根目录下的 gradle.properties)
- 修改 gradle 运行时,JVM的内存配置
- 所有发布模块统一版本号
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
VERSION=1.0.0
3.3.3、在全局 build.gradle 中引用配置文件(全局生效)

3.3.4、通用 java 库的 Maven 脚本
// 在项目根目录/gradle目录下新建:
// publish-java.gradle 文件,内容如下:
apply plugin: 'maven-publish'
// 定义 pom 所需要的内容
def pomConfig = {
licenses {
license {
name "${rootProject.ext.LICENSE.NAME}"
url "${rootProject.ext.LICENSE.URL}"
}
}
developers {
developer {
name "${rootProject.ext.DEVELOPER.NAME}"
}
}
scm {
url "${rootProject.ext.SCM.URL}"
}
}
// 生成 java 文档和源码包
task javadocJar(type: Jar, dependsOn: javadoc) {
archiveClassifier = 'javadoc'
from javadoc.destinationDir
}
task sourcesJar(type: Jar) {
archiveClassifier = 'sources'
from sourceSets.main.java.srcDirs
}
// Maven 的 task
// 运行 publishing 命令时,maven插件会寻找该任务
publishing {
publications {
// 自定义一个 publication,名字叫 component,类型是 MavenPublication
// 会在 build/publications 下生成该名字的 pom-default.xml文件
component(MavenPublication) {
// 由 Java 插件提供的标准发布构件,是包含了运行时依赖的 jar 文件
from components.java
groupId = group
artifactId = POM_ARTIFACT_ID
version = version
artifact sourcesJar
artifact javadocJar
// append additional configurations
pom.withXml {
def root = asNode()
root.appendNode('name', "${group}:${POM_ARTIFACT_ID}")
root.appendNode('url', "${rootProject.ext.PROJECT_URL}")
root.appendNode('description', 'android aop')
root.children().last() + pomConfig
}
}
}
// 定义 maven 仓库名称
// 1. 可以在这里定义一个 repositories
// 2. 可以在后面追加
}
// 指定发布仓库的本地路径(该路径为项目根目录下的 repo 目录)
publishing.repositories {
maven {
url "../repo"
}
}
3.3.5、模块引用与使用
- 在需要发布的 Java 模块下,新建一个适用于该模块的 gradle.properties 文件,内容如下:
POM_ARTIFACT_ID=aop-asm-gradle-plugin
POM_NAME=Android AOP ASM Gradle Plugin
POM_PACKAGING=jar
- 修改模块的 build.gradle
// 其它插件、所需依赖等信息
......
// 使用全局统一的 groupId 和 version
// artifactId 为模块下 gradle.properties 中定义的
group = "${rootProject.ext.GROUP}"
version = "${rootProject.ext.VERSION_NAME}"
/****************************************************************************
* Use command-line to build single module (at root project):
*
* $ ./gradlew :aop-asm-gradle-plugin:publish
****************************************************************************/
apply from: rootProject.file('gradle/publish-java.gradle')
3.3.6、打包发布
在 Android Studio 的 Terminal 面板中,输入上面的单个模块发布命令,如下图:

生成了我们需要的 jar 包。
四、公网仓库发布(JCenter)
如果无法翻墙,那这部分看看就行!
对于 Android 开发者,大家再熟悉不过了,就不用多介绍了,今天主要教大家如何注册和使用该仓库。
4.1、注册账号与仓库
- JCenter地址:https://bintray.com/

- (Sign Up)注册账号(如果大家有Github,就直接用Github账号)

- 点击 Sign up with Github(会要求你先登录 Github 账号)

- 点击『Authorize bintray-bot』,然后,需要完善其它信息(国内的邮箱貌似都被认为是临时邮箱,最好是 gmail 邮箱):

- 点击『Complete Registration』,然后会自动跳转到主页

- 创建 Maven 仓库(登录后的主界面,点击『Add New Repository』)

- 点击『Create』就创建好了 Maven 仓库,如下:

咱们自己的 Maven 仓库就创建好啦!
4.2、项目中添加配置及相关依赖
4.2.1、添加 JCenter 账号(根目录下的 gradle.properties)
获取 Jcenter 的 Key:点击账号 -> 选择『Edit』-> 点击『API Key』,如下图:


4.2.2、根目录 build.gradle 配置

4.2.3、修改 publish-java.gradle

4.2.4、上传至 JCenter
当我们做完以上配置后,有两种方式打包并上传至 JCenter 的 Maven(我们前面创建的仓库,但并未真正发布至公共可见)

本例采用命令行上传(用联通、移动开热点上传就快,电信...看运气):

上传成功,查看 bintray 的 maven 仓库:

可以看到已经有了,注意:右上角有个直连URL,我们可以在我们的根build.gradle中配置:

然后再『Sync now』,查看『External Libraries』:

已经可以下载了(虽然目前还没有加入到 JCenter 中,但是只要配有该 URL,就能访问下载 jar 包)。
4.2.5 请求加入至 JCenter

填写好理由,点击『send』就行啦!

至此,一个完整的流程就OK啦!
网友评论