1. 摘要
- 本文将详细介绍在Ubuntu服务器系统上安装Nexus(Maven服务器软件),并在Android Studio中创建最简单的Android工程和组件(下文中的组件均指module),并配置gradle文件,发布组件到Maven仓;最终另外创建单独的Android工程来引用此发布在私仓中的组件。
- 本文并不会深入介绍的软件所有功能,目标是以最简单的示例来完整说明整个工作流程。
2. 软件版本介绍
- OS : Ubuntu 18.04
- JDK : openjdk-8
- Nexus : nexus-3.38.1
- Android Studio : Android Studio Bumblebee | 2021.1.1 Patch 1
- Gradle : gradle-7.2 (插件版本7.1.1)
3. 搭建Maven私有仓库
上述软件清单大部分网上有现成的安装教程,非常容易获取对应的安装说明,以下重点介绍下与文档紧密相关的两个软件的安装方法;
其中Gradle未单独安装,本教程采用了工程默认配置,完成工程创建后会自动下载对应的版本;
Android Studio也采用了默认的安装选项,未做特殊配置。
-
安装 JDK
JDK 是 Nexus 软件运行的基础,需要先安装好,才能进行后面的安装。
安装命令:
sudo apt install openjdk-8-jdk
安装成功后可通过命令查看版本,如下图,代表已经安装成功:
安装 Nexus
-
下载 Nexus
Nexus是免费软件,可通过如下官方网址下载:https://www.sonatype.com/products/repository-oss
打开后点击首页按钮(下图红框)即可下载,如下图:
点击后会弹出一个信息页面,填写对应的信息后点击右下角 DOWNLOAD 按钮即可弹出下载页面,信息页面如下图:
然后会弹出一个不同操作系统版本选择的页面,如果想要在Linux系统下使用的话,可以下载第三个(UNIX)版本,本文因为要在Ubuntu系统安装,因此选择UNIX版本,如下图:
-
安装 Nexus
下载后文件名为:nexus-3.38.1-01-unix.tar.gz,为压缩文件,使用tar命令即可解压。
命令如下(默认安装Ubuntu情况下,/opt路径为root所有,所以如下涉及文件读写的操作需要sudo提权执行):
cd /opt sudo mkdir nexus sudo mv nexus-3.38.1-01-unix.tar.gz /opt/nexus cd /opt/nexus/ sudo tar -xvf nexus-3.38.1-01-unix.tar.gz
解压后的目录结构如下,包含两个目录,nexus-3.38.1-01 为程序所在目录,sonatype-work 为工作目录,用于存储文件:
解压后只要运行并启动 nexus 服务即可,命令如下:
cd /opt/nexus/nexus-3.38.1-01/bin sudo ./nexus run
运行命令后控制台输出如下结果,代表已经成功启动,可以通过浏览器访问服务:
-
配置 Nexus
浏览器访问地址默认为:http://192.168.1.111:8081,IP地址根据自己情况修改为linux主机的IP地址。访问首页截图如下:
点击上图右上角 Sign in 按钮,即可登录进行管理,登录需要输入账号和密码:
账号默认为:admin
密码默认安装后会随机生成一个,可以通过如下命令获取:cat /opt/nexus/sonatype-work/nexus3/admin.password
使用上述账号和密码首次登录会提醒要求修改密码:
这里我们修改为如下账号密码,方便后续操作:账号:admin 密码:admin123
修改默认密码后,会弹出一个对话框,要求选择是否允许匿名访问,如下图,这里我们选择不允许:
至此,我们已经完成了nexus的安装和最基础的配置,nexus默认会创建一系列仓库,我们已经可以正常使用并发布android的组件到仓库中。
下文我们将通过实例来把组件发布到上面截图的第三个仓:maven-releases 仓中。
4. 创建Android项目和组件(Module),并发布组件到Maven私仓
-
创建Android项目
New Project > Phone and Tablet > Empty Activity > Next项目配置如下:
-
创建Library组件
File > New > New Module... > Android Library组件配置如下:
完成上述操作后,项目的整体视图如下:
下面我们对项目的代码进行一些修改,以便容易演示下面步骤的结果:
首先在Library组件中创建一个空的Activity页面,上面显示模块的名称(My Library 01);
然后修改app工程代码,修改主页面,主页上显示应用名称(Application 03),并添加一个按钮,点击可以跳转到Library组件的Activity页面,以便测试Library代码的正确性。
具体代码实现比较基础,有一定android基础可自行完成,在此不再详细描述,附件有本文中用到的示例工程代码。
至此我们完成了一个最简单的app工程和Library组件,并在app工程中直接引用了Library组件。
-
配置 Libary 组件的 build.gradle 文件并发布组件到私仓
打开 mylibrary_01 组件的 build.gradle 文件,在最上面默认会加载一个插件,我们要增加一个插件(下面代码片中第二个插件为新增插件),修改后配置代码片段如下:plugins { id 'com.android.library' id 'maven-publish' }
在此 build.gradle 文件最下面添加如下发布任务,添加的配置代码片段如下:
publishing { publications { maven(MavenPublication) { groupId = "com.tony.demo" artifactId = "mylibrary-01" version = "1.0.0" description "mylibrary-01 description" afterEvaluate { from components.release } } } repositories { maven { allowInsecureProtocol true url = 'http://192.168.1.111:8081/repository/maven-releases/' credentials { it.username = "admin" it.password = "admin123" } } } }
上面代片段:
第一部分:为构建的组件信息描述
第二部分:为要发布到的maven仓库地址和用户名密码配置,因为我们使用了http,因此maven仓增加了 (allowInsecureProtocol true) 的配置项。
maven仓库的url地址获取方式为:打开web端maven服务器管理页面,在配置页面下,打开 Repositories 页面,点击对应的仓库,即可在详细信息页面查看,如下图所示:
-
发布组件
完成上述配置后我们重新同步一下工程,以便生成gradle任务,同步后我们打开右侧Gradle任务框即可看到新生成的 publish 任务,如下图所示:
此时双击 Gradle 的 publish 任务,即可启动library组件的编译构建过程,并在编译构建完成后自动发布到指定的 maven 仓库。
执行完成后 Android Studio 截图:
此时我们通过浏览器访问maven仓库,即可看到我们刚刚发布的组件:
Browse > maven-releases
5. 创建Android项目,并使用上个步骤发布到私仓的组件
与第4步相同的配置,我们创建 Application04,同样修改代码,在主页增加一个按钮,用来跳转到组件 mylibrary-01 的 Activity 页面。
不同的是,这此我们的工程通过私有仓库来引入 mylibrary-01 组件,而不是通过本地工程依赖。
-
配置 settings.gradle 文件,添加私仓地址
在 dependencyResolutionManagement 闭包下添加一个心的maven仓库配置:
maven仓库配置如下,注意这里因为使用了最新的gradle版本,配置相比老版本的配置方法有一定差异,如果使用老版本的gradle,需要修改maven仓配置方式。
maven { allowInsecureProtocol = true credentials { username "admin" password "admin123" } url 'http://192.168.1.111:8081/repository/maven-releases/' }
完整配置文件截图如下(红框中为我们新增的部分配置):
-
配置 app模块 的 build.gradle 文件,添加依赖,然后同步
这部分配置比较简单,只要在脚本的 dependencies 闭包下增加依赖即可:
implementation 'com.tony.demo:mylibrary-01:1.0.0'
点击sync后即可在代码中使用组件中的开放API。
-
调用并实现对 mylibrary-01 组件的调用
如下为最终成功调用library中的类的代码截图:
6 附件
文章中用到的示例工程已上传gitee,网址:https://gitee.com/jianfengtony/android_maven