Android 工具命令——发布项目到Maven

本文链接:https://rainmonth.github.io/posts/A201231.html

将项目发布到Maven,根据自己的需求,可以有以下三种方式:

  • 发布到本地Maven仓库,即在自己的电脑上共享;
  • 发布到本地局域网,即局域网内用户共享;
  • 发布到JCenter,即全网共享;

上面三种方式大同小异,具体可继续往下看。

准备工作

新建一个库,这里的库采用之前Android 发布在线库到JitPack中的库。

发布项目到本地Maven

发布到本地Maven,就是避免在每一个依赖库中都复制一份库项目代码,而是在自己的电脑上建一份,然后通过本地路径地址完成库项目的引用即可。具体步骤如下:

在库项目中新建uploadArchives任务

找到库项目的build.gradle文件,添加一个名为uploadArchives的Task,具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
apply plugin: 'maven'

uploadArchives{
repositories.mavenDeployer{
// 配置本地仓库路径,项目根目录下的repository目录中
repository(url: uri('../repository'))
pom.groupId = "com.rainmonth.utils"// 唯一标识(通常为模块包名,也可以任意)
pom.artifactId = "utils" // 项目名称(通常为类库模块名称,也可以任意)
pom.version = "1.0.0" // 版本号
}
}

注意:由于我用的是和Android 发布项目到JitPack相同的库,这里需要注释调库项目中JitPack插件的相关代码

添加完上述代码后,同步项目,在库项目utils的gradle任务下,就可以看到upload/uploadArchives任务了,如下图:

创建uploadArchives`

执行uploadArchives任务

上面的任务执行完成后,执行uploadArchives任务(双击任务名或者在命令行中用gradlew uploadArchives运行。执行完成后会看到项目根目录下多了如下文件:

执行uploadArchives任务结果

引用本地仓库中的类库

要引用上面生成的类库,首先需要告诉gradle我们在哪里可以找到类库,所以我们需要在项目根目录中指定生成库的地址,即在root Project中的build.gradle中添加如下代码:

1
2
3
4
5
6
7
8
9
allprojects {
repositories {
google()
jcenter()
// maven { url 'https://jitpack.io' }
// 告诉本地maven仓库的地址
maven { url('../repository')}
}
}

添加好后,在app module中的build.gradle添加引用库项目的代码,如下:

1
2
3
dependencies {
implementation 'com.rainmonth.utils:utils:1.0.0'
}

这样我们就可以在我们的项目中使用创建好的本地仓库了。

发布项目到局域网

将库项目发布到本地,有利于自己使用,避免多次复制,但像小型团队,最好是发布到局域网中,这样整个团队都能使用。要想讲项目发布到局域网中,需要借助搭建Maven私有仓库的工具Nexus

下载Nexus

下载地址:https://www.sonatype.com/download-oss-sonatype ,直接在官网下载很慢,可以科学上网,也可以找到下载链接然后直接使用迅雷下载,或者使用别人已经下载好的。

下载好后,解压,切换到bin目录下,输入如下代码运行nexus:

1
nexus start

一段时间后,在浏览器中输入http://localhost:8081 即可验证nexus是否安装成功。

安装成功后,使用admin登录,3.x版本的密码放在压缩包中,可以按提示自行查找,输入找到密码后,即可设置新的密码。

配置库项目的gradle文件

将库项目的gradle配置更改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// (PS:这个是2.x版本的nexus写法)
//上传到Maven仓库的task
uploadArchives {
repositories {
mavenDeployer {
//指定maven仓库url
repository(url: "http://localhost:8081/repository/maven-releases/") {
//nexus登录默认用户名和密码
authentication(userName: "admin", password: "admin123")
}
pom.groupId = "com.rainmonth.utils"// 唯一标识(通常为模块包名,也可以任意)
pom.artifactId = "utils" // 项目名称(通常为类库模块名称,也可以任意)
pom.version = "1.0.0" // 版本号
}
}
}

// (PS:这个是3.x版本的nexus写法)
//上传到Maven仓库的task
uploadArchives {
repositories {
mavenDeployer {
//指定maven仓库url
repository(url: "http://localhost:8081/repository/maven-releases/") {
//nexus登录默认用户名和密码
authentication(userName: "admin", password: "admin123")
}
pom.groupId = "com.rainmonth.utils"// 唯一标识(通常为模块包名,也可以任意)
pom.artifactId = "utils" // 项目名称(通常为类库模块名称,也可以任意)
pom.version = "1.0.0" // 版本号
}
}
}

其他配置不必更改,然后运行该任务。

运行uploadArchives时,我遇到了一下问题:

  1. 采用"http://localhost:8081/nexus/content/repositories/releases/"地址无效,于是我改为了"http://localhost:8081/repository/maven-releases/",这应该是nexus 2.x和3.x版本差异导致的。
  2. 同一个pom.version = "1.0.0" // 版本号不能重复发布,老是抱40X(401、405等错误 ),如是我查看了nexus 的maven-release的设置,发现默认是不能redeploy的,改为enable redeploy即可(或者更改一下版本好);
  3. 在app module中使用发布好的库时,发现一直访问不了,原因是我在安装Nexus时,没有允许匿名访问,这个时候需要在项目根目录下添加如下设置(即指定认证用户),为了避免这个,可以在Nexus引导中允许匿名访问即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
allprojects {
repositories {
google()
jcenter()
// maven { url 'https://jitpack.io' }
// 发布到本地配置
// maven { url('../repository')}
//私有服务器仓库地址
maven {
url 'http://localhost:8081/repository/maven-releases/'
//认证用户和密码
credentials {
username 'admin'
password 'admin123'
}
}
}
}

通过上面几步即可完成项目的局域网发布。

使用发布的项目

在app module的dependencies中添加依赖即可,如下:

1
implementation 'com.rainmonth.utils:utils:1.0.0'

发布项目到JCenter

发布到JCenter主要分一下几步:

  1. 注册JCenter账号(分企业的和开发者账号),个人开发者一般选择后者;

  2. 应用插件将库项目上传至JCenter,常用插件如下:

    • gradle-bintray-plugin

    • bintray-release

  3. 接下来的就是各种配置了,这里我没有实际操作,有需要的可以参考下面文章:https://blog.csdn.net/xmxkf/article/details/80674232

小结

这样就简单的介绍了下将项目发布到本地maven仓库、局域网maven仓库和JCenter的方法。期间会遇到一些问题,但只要实际操作一下,就会发现没有想象的那么麻烦。