如同以往的博客一样,先来说说为什么要写这篇博客吧。昨天做了一个android类库,由于有资源文件,所以打包成了aar,于是顺利将其集成到其它项目中,看起来没问题可以用,但是调试时候发现类库dependency中compile的第三方包没有正确的打包进来。这就悲催了,总不能在新的项目中将类库中需要的包compile进来啥,这不久太low了么,于是绞尽脑汁想解决办法,在网上找到不少资料说将类库发布到本地Maven仓库可以解决这个问题,尝试了下,的确可以解决(如果类库依赖了其它本地类库或者jar包则超出本博客的讨论范围,请看fat-aar相关资料)。
这篇文章的目的就是总结将Android类库发布到Maven仓库的实现方法,这里的Maven仓库有两种一种是本地的,一种是远程的(以Git为例)。
1、发布类库到本地Maven仓库
首先创建一个Android项目,然后创建一个我们需要的Android Library
这里创建一个名为androidLib的类库,在androidLib中添加对应的dependency依赖,这里添加个Gson和OkHttp3的依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.android.support:appcompat-v7:26.+'
testCompile 'junit:junit:4.12'
}
同时创建一个HelpUtil的辅助类(这个无所谓,主要是方便测试)
我们知道pom依赖是由三部分组成的比如下面的okhttp3的依赖,主要就是需要groupId、artifactId以及version。
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>3.4.1</version>
<scope>compile</scope>
</dependency>
那么我们在将类库发布到Maven仓库就需要配置这三个信息,同时还需要配置仓库的位置,于是就有了下面三个关键步骤。
a、androidLib模块中新建gradle.properties文件,添加以下内容
#包信息
ARTIFACTID = androidLib
LIBRARY_VERSION = 1.0.0
#Mac下地址: file:///Users/<username>/my/local/repo
#Windows下地址: file:///<盘符>:/users/<username>/my/local/repo
LOCAL_REPO_URL=file:///C:/Users/caicai/my/local/repo
这里设置好artifactId、version以及仓库位置对应的几个变量信息。
b、项目根目录下的gradle.properties(没有则新建一个)中添加如下内容
#包信息
GROUP_ID = com.yoryky.mavendemo
# Licence信息
PROJ_LICENCE_NAME=The Apache Software License, Version 2.0
PROJ_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
PROJ_LICENCE_DEST=repo
这里设置好groupId对应的变量信息。
c、开始配置groupId、artifactId、version以及仓库位置
在androidLib对应的build.gradle中添加如下内容
apply plugin: 'maven'
uploadArchives{
repositories.mavenDeployer{
repository(url:LOCAL_REPO_URL)
pom.groupId = GROUP_ID
pom.artifactId = ARTIFACTID
pom.version = LIBRARY_VERSION
}
}
实际上a和b都是在配置变量,正真的设置就是c这个地方,也可以直接跳过a、b步骤,直接在c这里赋值就行了。
关于发布的配置配置就算结束,同步下gradle,然后可以看到gradle工具中有如下uploadArchives命令
双击触发该命令,然后到我们设置的对应repo中可以发现,发布成功。
这里可以看到生成了一个pom文件以及对应的androidLIb.aar包,再来看看pom文件内容
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yoryky.mavendemo</groupId>
<artifactId>androidLib</artifactId>
<version>1.0.0</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>3.4.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.android.support</groupId>
<artifactId>appcompat-v7</artifactId>
<version>26.+</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
发现我们需要的okhttp3和gson都在里面了,那么在其它项目中compile这个maven仓库中的androidLib就会根据这个pom文件找到androidLib包的依赖并将其自动添加到项目中。
2、使用本地仓库中的类库
第一小节讲了如何将类库发布到本地仓库,那么这一小节来说说使用的问题。既然都发布成功了使用就很简单了。
首先,在Project的build.gradle中添加对本地Maven仓库的引用
allprojects {
repositories {
jcenter()
maven{
url 'file:///C:/Users/caicai/my/local/repo/'
}
}
}
这里的url就对应我们上面设置的仓库路径。
然后在对应模块中添加对androidLib的依赖既可
这里冒号分割的三个部分,就分别对应上面设置的groupId、artifactId以及version。
再看在项目中的使用
这确认了,androidLib依赖包被成功添加到了项目中。
3、说说远程Maven仓库
第一、二小节说了类库发布到本地Maven仓库以及使用,那么可以发布到远程Maven仓库么,答案是当然可以啊,这里就以github来说明吧。
先到github上创建一个new repository命名我MavenDemo,获取其git地址,然后将项目拉取到本地(名字也是MavenDemo),将repo下对应的类库拷贝到MavenDemo目录下,然后push到github。
本地的MavenDemo目录如下
提交到github后如下
那么远程Maven仓库就算是配置完成了(啥?这么简单)。
然后来看看使用吧
同样的我们需要在Project对应的build.gradle文件中去配置maven的url地址
赋值github项目路径
https://github.com/Yoryky/MavenDemo
将其变换为
https://raw.githubusercontent.com/Yoryky/MavenDemo/master
这其中将gitub.com变成了raw.githubusercontent.com然后在路径末尾添加了master。
这个raw.githubusercontent.com域名是github的素材库,我估计上传的maven仓库被放到这个域名下面,至于为什么不能直接用github项目路径作为地址,我也感到纳闷,有高手望指出。
有了路径后,还是配置好
allprojects {
repositories {
jcenter()
maven{
//远程maven路径
url 'https://raw.githubusercontent.com/Yoryky/MavenDemo/master'
}
}
}
然后通过同样的方法compile依赖androidLib,测试后发现依赖成功。
到这里也就算是说清楚了Android类库发布及使用maven仓库的过程,这里给出一个测试Demo吧,MavenDemo。
4、参考文献
1、发布Android studio项目到本地Maven仓库
2、Android导出aar时嵌套引用的那些坑