[小白架构笔记]搭建Maven私库并上传aar

环境说明

  • 服务器:腾讯云轻量应用服务器,Centos 7.6;
  • JDK:1.8x
  • Nexus:3.37.3-02-unix
  • Android:Android Studio( 4.1.1)、Gradle (4.1.1)、dokka– android-gradle-plugin(0.9.16)、gradle-wrapper(gradle-6.5-bin)

1.Nexus搭建私有仓库

自使用AndroidStudio进行开发后,使用第三方库非常方便,通过一句话依赖即可实现,而这些第三方库就存放在代码仓库中,比如jcenter;如果我们想把自己写的库也这么使用,那么我们就需要把我们的代码库上传到代码仓库中,比如以前可以选择Bintray(现在已不提供服务),或者更方便的jitpack,也可以上传到任何可访问的maven仓库(可以是本地的仓库,也可以是云端的仓库),因此本文的主要目的就是搭建一个自己的maven仓库。

搭建Nexus服务大致有两步:

  1. 安装并配置JDK
  2. 安装Nexus服务并启用

1.1 安装JDK

方式一:先下载JDK压缩包,然后上传到云服务器然后进行解压

方式二:Centos 7.6支持使用yum进行安装

  1. 云端目前支持安装的jdk版本

执行命令yum search java|grep jdk会列出当前支持的jdk列表;

  1. 选择版本后,安装(执行以下命令)会自动安装jdk相关依赖

执行命令yum install -y [你选定的jdk版本名字]进行安装;最后显示”Complete”表示安装完成。
image.png

  1. 确保JDK安装成功

执行命令java -version查看当前安装的jdk版本,如果已安装成功会显示版本号。

image.png

1.2 配置JDK

  1. 查找JDK安装目录

通过搜索java文件,查找jdk默认安装目录:执行以下命令find / -name 'java'

image.png

如上图确定jdk的安装目录在/usr/lib/jvm/java-xxxxx

  1. 配置环境变量

修改/etc/profile,在文件中添加如下内容:

注:执行vi /etc/profile命令即可使用vi编辑器打开指定文件;vi编辑器使用方法:按i进入编辑模式,修改完成后按ESC键进入命令模式输入:wq命令保存并退出:q!强制退出

`#set java environment`

JAVA_HOME=上面找到的jdk目录
JRE_HOME=上面找到的jdk目录/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
复制代码

配置完内容之后保存退出,并执行命令source /etc/profile或重启让配置生效。

到此JDK安装配置完成。

1.3 安装Nexus

  1. 下载压缩包

Nexus官网下载,进入官网之后需要填写一个表单才能获得下载地址。也可以通过执行wget 你得到的下载地址进行下载。

注意注意注意:折腾了很久发现这个压缩包怎么都下载不下来,应该是需要翻墙才能下载,最后我也是请我的朋友开启VPN之后帮我下载的

  1. 解压压缩包

将压缩包放在一个目录中解压,我是放在/usr/local/mysoft/nexus中的

  • 使用mkdir命令创建目录:mkdir -p /usr/local/mysoft/nexus(-p是递归创建目录,通常用于创建多级目录)
  • 解压目录:使用命令tar -zxvf {压缩包路径}  -C {解压目录:如/usr/local/mysoft/nexus}

解压之后会得到两个目录,一个nexus-{版本号}的安装目录,另一个是sonatype-work目录。

到此nexus安装完成

  1. 配置Nexus(可选)

配置文件路径...{nexus安装目录}/etc/nexus-default.properties(注:不同nexus版本的文件名可能不同,配置的内容也可能不同),一般使用Nexus默认配置即可,Nexus服务默认使用8081端口。

默认管理员账号密码存放在.../sonatype-work{注意该目录与nexus安装目录同级}/nexus3/admin.password文件中

  1. Nexus使用

切换到目录...{Nexus安装目录}/bin/执行命令:

  • 启动服务:./nexus start,实在不行还可以使用命令./nexus run
  • 停止服务:./nexus stop

启动过服务之后我们就可以通过8081端口访问Nexus服务管理了,至于Nexus怎么使用就去查阅资料吧。

1.4 Nexus服务搭建可能遇到的问题

1.4.1 上述操作经常出现Permission denied

在执行上述操作时,如果登录的用户对操作的目录没有权限,最容易出现目录或文件访问权限问题,解决办法是切换到root用户操作或者在执行命令的前面增加sudo,也可以更改Nexus目录的所属权或者更改用户的操作权限等等;

Linux的东西,我真心不太懂。。。都是才开始接触。
复制代码

1.4.2 Nexus服务到底启动成功与否的判断

执行启动Nexus命令之后没有任何输出,也不知道Nexus服务是否运行正常,这里引用冉哥的话:

1. 查询进程有没有启动
ps -aux |grep java
有数据的话,证明进程启动了。

2. 带网页的服务,查看端口有监听没
netstate -apln |grep 8081
有的话,一般网页就能打开了,但是却访问不了。那就第三步骤

3. 查看web服务是否正常
curl 127.0.0.1:8081 
模拟浏览器登录。

以上三步验证都是OK的。接下来应该是防火墙的问题
复制代码

image.png
curl通了之后说明服务是正常运行的。

1.4.3 无法对外访问Nexus服务

确保服务启动之后,发现对外无法访问Nexus(即通过云服务器IP地址:8081进行访问不通),因此初步猜想是防火墙问题。由于Nexus默认使用8081端口,如果我们需要对外访问nexus服务,我们便要在防火墙中开发8081端口:

以下为冉哥原话:

好了.
原因如下:
1. 防火墙的问题。
服务器开启了自己的linux防火墙。虽然你在云上面配置了,但是被linux系统阻止了。
方法有两个:
1.1 关闭防火墙。内网应用的话,一般都这么干。
systemctl stop firewalld ; systemctl disable firewalld ; 
对应的开启命令:systemctl start firewalld ; systemctl enable firewalld ; 

1.2 添加防火墙,允许8081端口访问
开启:firewall-cmd --permanent --add-port=8081/tcp
重新加载配置:firewall-cmd --reload
查看:firewall-cmd --list-all
复制代码

开启了服务器的防火墙之后,我们还需要在云服务器的防火墙上开发8081端口访问:

image.png

完成上面三步,基本上就没啥问题了。

1.4.4 Nexus服务使用的进一步说明

  • 可以在服务器上配置Nexus开机自启动;

  • 可以配置Nexus日志

1.4.4.1 角色管理

打开Nexus管理网站并用管理员账号登录,发现用户管理中只存在nx-adminnx-anonymous两种角色,第一个上管理员角色,第二个是游客角色,管理员具备所有功能,游客只包含仓库查看相关功能

image.png

image.png

因此我还需要一种角色,用于开发者上传库到仓库中,因此具备仓库的读写权限才行,由于我只用得上maven,因此只开放了maven的读写权限:

image.png

1.4.4.2 用户管理

创建对应的用户账号,这样便可以登录Nexus进行代码上传或者使用自动上传方式将代码上传到仓库中;默认已经存在adminanonymous两个用户,为自己分配一个开发账户,分配之前创建的nx-deployment权限。

image.png

image.png

1.4.4.3 仓库管理

由于我的目的是将自己的Android库上传到这个仓库中进行管理,由于这些库是app领域的,所以我打算创建对应的app使用的仓库(也可以不创建,默认已经提供了几种仓库):

最终我创建了三个仓库,一个group,两个hosted(一个用于release,一个用于snapshot),group这个是对外访问的。
image.png

创建release和snapshot的时候,由于我们是创建的hosted类型的仓库,用来保存上传的代码,所以我们需要勾选上“Allow redeploy”(即可以重新发布,比如我之前发布了某个库的1.0版本,后面我还是可以再重新发布覆盖这个版本):

image.png

创建group的时候,将前面创建的release和snapshot关联进去:

image.png

到此Nexus部署和配置完成,接下来就尝试将代码上传到自己的仓库中吧。

【题外话】备份冉哥语录:

1. 查看服务运行状态
[root@VM-0-9-centos bin]# ps -aux |grep java
root     23948  1.5 79.6 5223272 1499152 ?     Sl   11:38   2:24 /usr/li....org.sonatype.nexus.karaf.NexusMain

2. 干掉它
[root@VM-0-9-centos bin]# cd /usr/local/mysoft/nexus/nexus-3.37.3-02/bin
[root@VM-0-9-centos bin]# ./nexus stop
发现干不掉,直接用kill强杀(root用户执行)

3. 修改目录属组:root用户执行
[root@VM-0-9-centos local]# cd /usr/local/
[root@VM-0-9-centos local]# chown superluo mysoft -R
[root@VM-0-9-centos local]# ll -ald mysoft
drwxr-xr-x 3 superluo root 4096 3月   2 10:24 mysoft
[root@VM-0-9-centos local]# cd mysoft/
[root@VM-0-9-centos mysoft]# ll
drwxr-xr-x 4 superluo root      4096 3月   2 11:34 nexus

4. 切换到superluo启动服务
[superluo@VM-0-9-centos bin]$ cd /usr/local/mysoft/nexus/nexus-3.37.3-02/bin
[superluo@VM-0-9-centos bin]$ ll
total 32
drwxr-xr-x 2 superluo root  4096 Mar  2 10:26 contrib
-rwxr-xr-x 1 superluo root 18620 Dec 30 03:20 nexus
-rw-r--r-- 1 superluo root    15 Dec 30 03:20 nexus.rc
-rw-r--r-- 1 superluo root  1635 Dec 30 03:20 nexus.vmoptions
[superluo@VM-0-9-centos bin]$ ./nexus start

5. 网页访问
http://{你的云服务器ip地址}:8081/
默认密码我改过了,改成:{私密信息}
默认密码的地址:第一次登录有页面提示
[root@VM-0-9-centos mysoft]# cat /usr/local/mysoft/nexus/sonatype-work/nexus3/admin.password
1d0da450-3725-4d6a-bcc9-d8f8696fc545
复制代码

2. Android上传aar到私库

2.1 准备工作

在上传代码之前,我们需要如下信息:仓库地址,访问仓库的用户名和密码;

查看仓库地址:

image.png
而访问仓库的用户名和密码就是前面在Nexus上添加的User账户和密码。

2.2 配置工程

至于如何创建Android项目,这个就不说了。

2.2.1 在工程的local.properties中添加如下信息:即配置Maven仓库的地址、用户名和密码

image.png

可以用任意你喜欢的方式管理这些信息,我只是考虑我有多个库都需要这些信息并且不像上传到网上就放在这个文件中了而已,你可以直接使用这些信息,或者用graldle文件管理都行

2.2.2 在工程的build.gradle中添加如下信息
![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2b449224979d4c48ada1656f9fe8a472~tplv-k3u1fbpfcp-watermark.image?)
复制代码

classpath 'org.jetbrains.dokka:dokka-android-gradle-plugin:0.9.18'这个配置非常关键,后面进行说明;

2.2.3 在Module的build.gradle中配置如下信息

image.png

文件的下面添加这些信息

image.png
一屏截不完,继续

image.png

附相关代码:

plugins {
    /*用于kotlin生成javadoc*/
    id 'org.jetbrains.dokka-android'
    /*用于上传maven*/
    id 'maven'
}

//这部分添加在文件最后都可以的
// kotlin android javadoc
task generateSourcesJar(type: Jar) {
    group = 'jar'
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) {
    outputFormat = "javadoc"
    outputDirectory = javadoc.destinationDir
}

task generateJavadoc(type: Jar, dependsOn: dokkaJavadoc) {
    group = 'jar'
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives generateJavadoc
    archives generateSourcesJar
}


def PROJECT_NAME = '{根据自己情况补全内容}'
def PROJECT_VERSION = '{根据自己情况补全内容}'
def PROJECT_DESC = '{根据自己情况补全内容}'
def ARTIFACT_ID = '{根据自己情况补全内容}'


Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def NEXUS_URL = properties.getProperty('NEXUS_URL')
def NEXUS_USER = properties.getProperty('NEXUS_USER')
def NEXUS_PWD = properties.getProperty('NEXUS_PWD')

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: NEXUS_URL) {
                authentication(userName: NEXUS_USER, password: NEXUS_PWD)
            }
            pom.project {
                name PROJECT_NAME
                version PROJECT_VERSION
                artifactId ARTIFACT_ID
                groupId '{根据自己情况补全内容}'
                packaging 'aar'
                description PROJECT_DESC
            }
        }
    }
}
复制代码

到此配置完成

2.3 上传代码到仓库

image.png

运行uploadArchives任务即可,如果没意外任务运行成功,那么代码就上传成功了,可以通过Nexus后台管理系统查看代码是否已上传:

image.png

到此我们已经成功把代码库上传到自己的Maven仓库中。

2.4 使用仓库中的代码

在工程的build.gradle中配置一下内容:

image.png

其实也就是将之前的仓库地址配置进来才可以访问。

在Module的buid.gralde中添加依赖,依赖语句其实你上传的时候就指定了group、artifactid和版本号就已经知道了,也可以通过如下方式查看依赖语句:

image.png

到此Android aar的上传和使用完成。

2.5 重要说明
2.5.1 无法生成JavaDoc

这里面遇到的最大问题是,最开始我按照以前Java工程的配置形式进行配置,在最终上传的时候提示生成JavaDoc失败,导致无法上传成功。

最后经过分析发现提示无法生成JavaDoc的错误均显示的是kotlin文件而没有Java文件,因此推测是Kotlin编写的文件才会存在这个问题。

经过搜索找到了Dokka用于解决该问题,参考资料如下:

Kotlin开源库上传Bintray(Maven)代码库遇到的问题总结

Dokka-生成JavaDoc:传送门

Dokka-Github:传送门

2.5.2 Dokka版本问题

正如上面参考资料所示“Dokka-生成JavaDoc:传送门”,存在Kotlin项目和Kotlin开发的Android项目两种类型,两者插件有所区别,所以这里一定要注意。

这里还有个问题就是这个文章上用的是0.9.15的Dokka,最开始我配置这个版本的时候,发现怎么都无法编译成功,存在一个问题无法解决,应该是这个版本的插件与我项目中使用的Kotlin版本无法兼容导致的,因此改为使用0.9.16之后没有这个问题了。后来搜索资料发现存在0.9.18版本,目前还未用这个版本,后面会尝试。

3. 附相关参考资料

LINUX上搭建MAVEN+NEXUS私人仓库

Linux搭建Nexus3.X私服

Linux服务器安装Nexus构建maven私有仓库(maven私服) 

如何把本地代码上传到阿里云服务器Centos7的nexus3 maven私服中

Android Studio上传aar到私有maven仓库

Dokka-生成JavaDoc:传送门

Kotlin开源库上传Bintray(Maven)代码库遇到的问题总结

Dokka-Github:传送门

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享