如何将Android studio中Library发布到私服Nexus仓库

android studio 教程 | 2019-03-15 15:06

对于自己封装的library可以放到远端仓库,目前有以下几种方式。 1:上传到github,打tag,然后登陆JitPack,获取到相应库的版本,最后引用。 2:上传jcenter仓库,审核通过,然后引用。 3:公司内部通过nexus搭建私服,上传类库,下载使用。 gitbub一般个人使用偏多,不适合公司项目;jcenter上传流程复杂,而且需要审核时间;这时,选择私服无疑是一个不错的选择,公司内部搭建,上传简单,而且添加权限无需审核。

在你引入library的所在项目的根目录上添加maven-publish.gradle文件

apply plugin: "maven"

def username = ""

def pwd = ""

def nexusRepositoryUrl = "http://nexus/repository/maven-snapshots/"

def VERSION_NAME = '1.0.0'

def ARTIFACT_ID = 'imagepicker'

def GROUP_ID = 'com.zzti.fyg'

uploadArchives {

repositories {

mavenDeployer {

repository(url: nexusRepositoryUrl) {

authentication(userName:username, password: pwd)

pom.project {

artifactId ARTIFACT_ID

version VERSION_NAME

groupId GROUP_ID

packaging 'aar'

description 'lib des'

在你需要上传的library的build.gradle文件中引入配置下面这句话

apply from: project.rootProject.getProjectDir().absolutePath + "/maven-publish.gradle"

这句话就是引入maven-publish,maven-publish所在的路径你library所在的项目的根目录。这样的每一个你需要上传library只需要添加这句,就可以通用主工程的上传aar脚本。

在Android Studio右侧gradle的Tasks中会多一个upload任务,点击uploadArchives,上传处理

1首次上传该库的时候找不到metadata,会报下面异常,但是你可以登录到web的nexus服务器上看下,已经上传成功,再次上传就不会遇到该提示。

Could not find metadata ... library/maven-metadata.xml in remote (http://localhost:8081/nexus/content/repositories/thirdparty)

2 android发布maven报错

Could not write to file '*****/build/poms/pom-default.xml'

发现是gradle引入的三方依赖库,重复引用问题,但是在查找的时候发现, 如果此组件在开发时作为单独app运行,由于依赖的库比较多,导致方法数超过65535,因此使用了multidex,在切换成library的时候需要去掉,不然也会报此错误。

multiDexEnabled true

3 删除本地缓存很重要

.gradle/caches/modules-2/files-2.1

在要使用library的项目最外层的build.gradle中配置maven私服地址

allprojects {

repositories {

url 'http://nexus.**/repository/maven-releases/'

credentials {

username ''

password ''

在要在使用的library中引入

implementation 'com.zzti.fyg:imagepicker:1.0.0'

坑:切记如果有权限限制,gradle中进行权限配置,否则不能下载成功

每一次修改代码都需要aar重新打包,上传,如果你没有变更版本号,就会报次错,因为release版本不运行相同版本存在。nexus私服为了解决这个不便,新增了不同类型的仓库。一个是release,一个是snapshot。其中snapshot适合我们平时开发时候,每次修改代码无须修改版本号,直接打包提交,也能成功上传,并且可以下载使用。

有时间我们需要更新新的library版本,由于本地有缓存,点击同步不能下载下来,我们可以找到本地library手动删除,在去同步下载。

Mac系统默认下载到:

/Users/(用户名)/.gradle/caches/modules-2/files-2.1

Windows系统默认下载到:

C:\Users\(用户名)\.gradle\caches\modules-2\files-2.1

建议是除此之外,也要把项目里面的.gradle->libraries相应的库手动删除。因为在实际中,本地缓存删除之后,但是这个引用有时没变,依旧找不到依赖库。

有时上传新包之后,私服web端已经是最新的包,但是下载时候一直下载旧版本,手动把下载到本地的library删除之后,发现仍不是最新版本,真让人头大,这时候,可以通过下面命令,清理缓存,可以设置不同时间。

configurations.all {

resolutionStrategy.cacheChangingModulesFor 1, 'minutes'

在将library打成aar上传到私服,偶尔会出现上传成功,而且在web端可以看到,但是下载失败,最初以为是打的aar有问题,但是通过降低gradle版本也可以成功下载,或者我重新打aar,变更版本也可以重新下载,根本原因没有查清楚,有清楚的码友可以指导下。