Android:超详细的本地搭建maven私服以及使用Nexus3.x搭建maven私服的讲解

前言

Android开发中,会经常遇到需要将写好的某个lib用于各个不同的项目中。一般的做法,就是将lib直接导入到项目中。但是假如libbug,那么所有使用lib的项目我们都要进去修改libbug,这样即繁琐,工作量又大。假如我们可以像gralde中添加依赖那样,直接一句implementation 'xxx'代码从maven仓库中调用lib,那么我们就不用再一个一个项目中去修复libbug了,这样不仅省事了许多,还安全。

正文

一、本地搭建maven私服

  1. gradle中添加如下代码,与android{...}同级
// 添加 maven 插件
apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
           pom.project {
                // 自定义的项目分组
                groupId 'com.homeprint.lib'
                // 自定义项目名称
                artifactId 'homeprint-core'
                // 项目版本号
                version '1.0.1'
            }

            // 自定义本地仓库路径,此处是项目根目录下的 repo 目录中
            repository(url: uri("../repo"))
        }
    }
}
  1. 点击gradle右上角的Syc Now,同步一下项目,然后在右侧的项目的gradle中找到Tasks中的upload,双击upload中的uploadArchives,将项目发布到本地的maven仓库中
发布项目到本地maven仓库
  1. 我配置的本地仓库路径是项目根目录的repo目录,所以可以看到在项目根目录中出现仓库文件夹
    本地maven

4.如何在项目中引用发布的lib?

  • 首先在工程的build.gradle(是projectbuild.gradle而不是modulebuild.gradle)中添加我们配置的本地仓库路径。
    (注:build.gradle中有两个repositoriesbuildscript中的是用于gradle本身构建时使用的,allprojects中的才是给项目依赖使用的,我们在allprojectsrepositories中添加本地maven地址)
本地maven仓库路径
  • 然后在需要使用的module中添加依赖implementation 'com.homeprint.lib:homeprint-core:1.0.0',依赖的项目名规则为groupId:artfactId:version,所以我的依赖为com.homeprint.lib:homeprint-core:1.0.0

这样就完成了,我们就可以肆无忌惮的在需要的项目中引用我们发布的lib啦,但是这个仅限于本地使用,给自己独立开发时提供方便。如果是团队开发,大家使用不同的电脑,就不行了。那么团队开发时,我们想要达到这种效果该怎么做呢?

二、使用Nexus3.x搭建maven私服

1. 下载Nexus3.x

现在Nexus最新版已经是3.x了,个人喜欢使用新版,所以本次我们使用Nexus3.x来搭建maven私服。我们先去官网下载Nexus Repository Manager OSS 3.x,我用的是windows系统,所以我下载的是windows版本

pic_nexus_download

2. Nexus的安装与配置

  1. 目前最新版是3.14.0,将下载的压缩包解压

    解压后的文件

    在减压的文件夹nexus-3.14.0-04-win64中有两个文件夹nexus-3.14.0-04sonatype-worknexus-3.14.0-04是程序,sonatype-work是工作目录,如果以后要备份数据,只要备份sonatype-work就行。

  2. nexus-3.14.0-04-win64\nexus-3.14.0-04\bin文件夹所在路径添加到环境变量Path中,我的路径是D:\software\nexus\nexus-3.14.0-04-win64\nexus-3.14.0-04\bin

  3. 配置nexus-3.14.0-04-win64\nexus-3.14.0-04\etc目录下nexus-default.properties文件

    pic_nexus-default.properties

上述配置中有三个字段关注一下,application-hostapplication-port以及nexus-context-path

  • application-host :是你访问的nexus服务器的IP,默认为0.0.0.0(即只要是本机上的IP,就能连上nexus服务器详解点我)。为了安全和屏蔽掉其他IP,我们可以改访问IPlocalhost指向的IP(一般默认指向127.0.0.1,可以去C:\Windows\System32\drivers\etchosts文件中查询localhost指向的IP),改成本机上其他IP也可以

  • application-port:是IP的端口号,默认为8081,如果端口号被占用,自行换成其他端口号

  • nexus-context-path:上下文对象路径,默认是没有的,如果添加了上下文对象路径,需要在访问地址(访问地址:application-host:application-port)后面加上下文对象路径,即访问地址变为:application-host:application-port/nexus-context-path

    以下是个人更改后的字段值,当然如果只想简单使用,不更改也没事,可以跳过

application-port=8081
application-host=127.0.0.1
  1. 打开CMD,执行命令nexus.exe /run
  2. 浏览器中输入:127.0.0.1:8081(此处为你配置的application-host:application-port,如果你也配置了nexus-context-path,则为application-host:application-port/nexus-context-path,例:假如我配置nexus-context-path=/test,浏览器中输入:127.0.0.1:8081/test),进入nexus管理页面,至此nexus已经安装并且启动成功
    nexus入口

3. Nexus的仓库创建

在创建仓库前,先介绍一下仓库的三种存储类型ReleaseSnapshotMixed,创建仓库时会使用到

三种仓库存储类型

  • Release(正式版): 正式版,适合项目稳定后正式发布使用,特性看下面的原理简介 [important]
  • Snapshot(快照版): 快照版,适合项目在开发调试中使用,特性看下面的原理简介 [important]
  • Mixed(混合版): 可包含release和snapshot版本

ReleaseSnapshot的原理简介:

它们的主要区别在于本地获取这些依赖的机制不同。

  • 对于Release版本的项目: 当项目中添加了一个正式版的version为x的依赖时,构建工具在构建项目时会从远程仓库中下载这个version为x的依赖到本地仓库缓存起来,下次再构建项目时,构建工具会从本地仓库中查找是否存在这个version为x的依赖,存在就不会在去远程仓库中拉取。这种特性会导致在团队开发中,如果你发布一个正式版的项目时,仍然使用的是同一个version,就可能出现其他使用这个version项目的成员根本接收不到项目的最新变更,这是糟糕的,为了生命安全,大家尽量不要这么做。所以,在每次发布正式版项目时,必须更新version。
  • 对于Snapshot版本的项目: 当项目中添加了一个快照版的version为x的依赖时,不管本地仓库中是否存在这个version为x的依赖,构建工具都会尝试从远程仓库中查看这个version为x的依赖是否最新。这样就能保证团队开发时,所有使用这个version为x的依赖的项目都能获取到依赖最新的变更,而且不用不停的迭代依赖的version。最后一还有一点,Snapshot版项目发布时的version一定要以-SNAPSHOT结尾,英文字母必须大写。

下面正式开始仓库创建流程:

  1. 先登录,初始用户名和密码分别为adminadmin123
  2. 登录后,如下图操作所示,看到有个模块为Blob Stores,这是文件存储的地方,默认存在default中,你可以点击Create blob store自己创建一个存储点
    文件存储的地方

    这里,我自己创建了名为homeprint的新的存储点
    新建存储点

    homeprint存储点
  3. 创建自己的maven仓库


    创建自己的maven仓库

    选择要创建的maven仓库类型
  4. 可以看到一共有三种maven类型的仓库供我们选择
  • hosted(宿主仓库) :专门存放无法从远程仓库中下载的构件或者公司内部自主开发的一些构件。当hosted仓库找不到目标构件时,并不能从远程仓库下载。并且想要将内部开发构件上传到maven仓库,三种仓库中只能使用hosted。

    宿主仓库创建

  • proxy(代理仓库) : 当用户向proxy请求一个资源时,proxy会先在本地仓库中寻找是否有该资源,没有的话会从远程仓库下载,然后返回给用户;同时会缓存在本地,下次用户再请求相同资源时,就可以直接在本地中找到并返回给用户。proxy起到一层缓存与中转的作用。
    proxy代理的远程仓库可以配置,这里我选择阿里云的maven仓库http://maven.aliyun.com/nexus/content/groups/public/,因为在国内比中央仓库快很多)
    (注意:不支持将内部自主研发的项目上传到proxy上,只能上传到hosted中,proxy的主要作用只是缓存从远程仓库下载的资源和作为中转站去远程仓库下载需要的资源)

    代理仓库创建

  • group(仓库组) :多个仓库的聚合体,将你在nexus中想要使用的maven仓库聚合在一起,对用户暴露统一的地址,这样用户就不需在项目中配置多个maven地址了。(同样也不支持将内部研发项目上传到group中,只能发布到hosted)

    仓库组创建

  1. 仓库创建完成(不必要三种仓库都创建,选择你想创建的就行)。点击仓库的copy可以拷贝仓库路径。
    仓库创建完成

4. 发布项目到maven仓库

第一种:使用gradle自动发布

在需要发布的module的build.gradle中加入如下代码,与在第一种在发布到maven仓库的实现基本一致

apply plugin: 'maven'

uploadArchives {
    configuration = configurations.archives
    repositories {
        mavenDeployer {
            // 仓库路径(只能是hosted仓库)
            repository(url: 'http://192.168.10.128:8081/repository/homeprint-hosted/') {
                // 你 Nexus 的账户密码
                authentication(userName: 'admin', password: 'admin123')
            }
            pom.project {
                version '1.0.1'
                artifactId 'homeprint-common'
                groupId 'com.homeprint.lib'
                description 'xxxxxx'
            }
        }
    }
}

然后在右侧的双击下图中的uploadArchives,即可发布上传

上传项目到hosted仓库中

上传完成后,可以在仓库中看到发布的项目
项目上传完成

第二种:使用网页上传

点击仓库的upload component可以手动上传,一般现成的jar或者aar文件可以直接选择手动上传

网页上传

网页上传详情

5. module中使用发布的项目

在工程的build.gradle中添加maven地址

allprojects {
    repositories {
        maven { url 'http://127.0.0.1:8081/repository/homeprint-group/' }
    }
 }

在module的build.gradle中添加依赖

  implementation 'com.homeprint.lib:homeprint-common:1.0.0'

三、其他注意事项

1. gradle中如何指定要上传到maven的文件

// 将项目指定的 _exports 文件夹下的内容打成 jar
task makeJar(type: Jar) {
    baseName = "hpauth-exports"
    version = "1.0.0"
    extension = "jar"
    from('build/intermediates/classes/debug/')
    from('build/tmp/kotlin-classes/debug/')
    include('com/homeprint/module/auth/_exports/**')
    destinationDir = file('build/_exports')
}

// 配置需要上传到 maven 仓库的文件,即将上面打包的 jar 上传
artifacts {
    archives makeJar
}

// 上传部分仍然与之前相同
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: 'http://127.0.0.1:8081/repository/maven-snapshots/') {
                authentication(userName: 'admin', password: 'admin123')
            }
            pom.project {
                version '1.0.0-SNAPSHOT'
                artifactId 'hpauth-exsppt'
                groupId 'com.homeprint.module'
                description 'xxxxxxx'
            }
        }
    }
}

2. 关于外部设备访问Nexus的问题

上述中,一开始我配置的IP地址127.0.0.1,此IP地址外部设备是连接不上的,仅能本机访问。如果要在同一局域网内让外部设备可以访问,请更改为能让外部设备连上的IP地址,例如PC在局域网内被分配到的IPV4地址。详解点我

3. 关于Nexus初始时的默认仓库

nexus在一开始就给我们提供了一些默认仓库


默认仓库
  • maven-central:代理仓库,配置的是maven官方2号仓库的地址
  • maven-public:仓库组
  • maven-releases:宿主仓库,仓库的存储类型为Release
  • maven-snapshot:宿主仓库,仓库的存储类型为Snapshot

上述内容中已经对这些仓库的类型介绍过,就不在多说了。这些默认仓库我们是可以直接使用的,基本已经满足我们所有的需求,所以如果不创建仓库,可以直接使用默认仓库。

4. Android开发中常用的maven代理地址

以上几个基本就是android开发中常用的几个maven仓库了,其中阿里云是国内仓库,其他是国外仓库。国内仓库的优势在于下载速度快,毕竟祖国伟大的网络对于国外的网络不怎么友好。但是国内仓库可能更新会比国外仓库慢一点。出于以上考虑,我们可以将以上仓库都集成在group仓库组中,一定要将阿里云放在其他国外maven仓库的上面,因为访问仓库时的顺序是从上往下访问的,这样就既有了国内仓库的速度,又可以在国内仓库没有资源时,去国外仓库获取到资源。

5. Nexus中用户的权限管理

团队开发的时候,为了避免散发超级管理员权限,可以根据每个成员的实际情况,给他们配置用户角色和权限。

  • Security -> Privileges: 所有的权限都放在了这里
    权限大全
  • Security -> Roles: 角色管理界面,可在此界面创建角色
    创建角色

    角色权限
  • Security -> Users: 用户管理界面,可在此界面创建用户
    创建用户

    用户权限
  • Security -> Anonymous: 匿名用户管理界面(即游客管理),这里有个注意的地方,如下图中,有个Allow anonymous users to access the server,游客默认是有浏览读取仓库的权限的,如果取消勾选,则游客没有任何权限。
    游客权限1

    游客权限2

6. 如何从Nexus中下载jar包或者aar包

资源下载

四、如何实现在外网中访问自己的maven仓库

  1. 将项目上传到 Github码云或者类似的管理平台中,通过jitpack发布(最简单的方式)
  2. 将项目发布到jcenter或者mavenCentral中,这个比第一种复杂一些,如果要使用jcenter发布,可以使用bintray-release插件
  3. Nexus部署到阿里云或者其他云服务器中,这时使用的版本不再是Windows版而是Unix
  4. 以上都是常用的方法,因为时间关系就不再详细介绍了,大家可以自行百度。最后介绍一种取巧的方法,就是找一些可以将内网IP映射到外网访问的小工具,比如nat123花生壳之类的,这里我用的是windows_386,一共就三个文件
    windows_386

    其中a.bat是运行文件,里面就一行代码如下:
ngrok -config=ngrok.cfg -subdomain my 8080

其中my为域名的前缀,8080为端口号,这两样是可以根据需要,自行修改的。双击a.bat文件开始运行程序,结果如下:

ngrok                                                                                                   (Ctrl+C to quit)

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://my.tunnel.qydev.com -> 127.0.0.1:8080
Forwarding                    https://my.tunnel.qydev.com -> 127.0.0.1:8080
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

Tunnel Statusonline时,代表已经将内网IP映射到公网上,映射的IP为127.0.0.1(不可变),端口号为你在a.bat中配置的端口号,此处为8080(可配置)。与IP绑定的域名为my.tunnel.qydev.com,其中前缀my即为你在a.bat中配置的前缀。这样你在浏览器中输入my.tunnel.qydev.com就可以连上本机的127.0.0.1:8080。然后,将nexus的IP和端口号分别配置为127.0.0.18080就可以在外网访问到本机上的Nexus了。这种方式很简单,成本低,但是访问速度有点慢,但是谁还没有个不在公司coding的时候,这时候就可以提供点便利了。

感谢下列文章

理解Maven中的SNAPSHOT版本和正式版本

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容