搭建Maven 私服
本文整理目前网络上关于NEXUS搭建Maven私服的文章,记录关于如何搭建一个属于自己的Maven私服,以方便Android 项目的模块化,规范化的实现
私服的安装和使用
-
下载maven服务器
# 创建目录 mkdir nexus cd nexus # 下载软件 wget http://download.sonatype.com/nexus/oss/nexus-2.10.0-02-bundle.tar.gz # 解压软件 tar -zxvf nexus-2.10.0-02-bundle.tar.gz
-
为了让nexus 能够正常运行,需要把nexus 用root 的权限来打开
修改/home/lwk/nexus/nexus-2.10.0-02-bundle/nexus-2.10.0-02/bin/nexus 文件
将 RUN_AS_USER 修改为root

-
nexus 的相关操作
./nexus start ./nexus stop ./nexus status
这里要注意一个问题 :
因为nexus 是采用root 的权限来启动的,因此会遇到一个让你来输入密码的操作,而此时输入密码会遇到一个
su: 密码不正确
,在这里需要为系统设置这个密码su passwd
-
nexus 的操作
完成了上述操作,这时nexus 就已经启动了,这时我们需要打开nexus ,在浏览器输入
localhost:8081/nexus
然后我们可以看到nexus 的主界面

这时,我们需要点击右上角的登录功能,默认的账号密码是 admin/admin123
-
认识nexus
-
左侧菜单
artifact Search 搜索 views\repositories 仓库 security 安全相关的配置 administration nexus一些相关配置 help 一些没有用的关于啊啥的
-
重点讲一下views\repositories , 其他的基本在Android 端不需要去考虑
Public Repositories:仓库组 3rd party:一般自己上传无法从公共仓库获得的第三方发布版本的依赖包、例如oracle的ojdbc等、 Apache Snapshots:用了代理ApacheMaven仓库快照版本的构件仓库、一般不使用 Central:用来代理maven中央仓库中发布版本构件的仓库 Central M1 shadow:用于提供中央仓库中M1格式的发布版本的构件镜像仓库 Releases:用来部署管理内部的发布版本构件的宿主类型仓库 Snapshots:用来部署管理内部的快照版本构件的宿主类型仓库 jybd_web_view: 这个是一个自己上传的仓库,并非nexus自带仓库
-
点击repositories
image-20200103204329412.png
-
接下来,我们需要新建我们自己的仓库
img
-
然后进行相关配置
img
-
有几个需要重点说一下的点:
- Respository ID 是该仓库的唯一标示
- Respository Name 是显示在外面的仓库的名字
- Respository Policy 通常我们需要创建,一个release库 (对应 Release),一个snapshot 库 (对应Snapshot),这个很重要
- Deployment Policyt 这个需要修改成 Allow Redeploy
这时我们的仓库创建完毕了。
Android 端的配置
library 的上传
- 在项目根目录的
grade.properties
文件中
# grade.properties
NEXUS_REPOSITORY_URL=http://localhost:8099/nexus/content/repositories/snapshots/
MC_AUDIO_RELEASE_URL=http://localhost:8099/nexus/content/repositories/mc_audio_release/
MC_AUDIO_SNAPSHOTS_URL=http://localhost:8099/nexus/content/repositories/mc_audio_snapshot/
POM_GROUPID=com.team_5zdh.android
POM_PACKAGING=aar
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123
- 在项目根目录的gradle 文件中,添加我们需要引入的仓库
apply from: this.rootProject.file('imooc.gradle')
buildscript {
repositories {
jcenter()
google()
mavenCentral()
maven {
url MC_AUDIO_RELEASE_URL
credentials {
username 'admin'
password 'admin123'
}
}
maven {
url MC_AUDIO_SNAPSHOTS_URL
credentials {
username 'admin'
password 'admin123'
}
}
}
dependencies {
.....
}
}
allprojects {
repositories {
jcenter()
google()
maven { url "https://jitpack.io" }
//此处为项目引入提供相关配置
maven {
url MC_AUDIO_RELEASE_URL
credentials {
username 'admin'
password 'admin123'
}
}
maven {
url MC_AUDIO_SNAPSHOTS_URL
credentials {
username 'admin'
password 'admin123'
}
}
}
}
- 在我们自己封装的lib 库中的
build.gradle
,进行相关配置
//上传maven配置
uploadArchives {
repositories {
mavenDeployer {
repository(url: MC_AUDIO_RELEASE_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
snapshotRepository(url: MC_AUDIO_SNAPSHOTS_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
pom.project {
name pomName
version pomVersionName
description pomDescription
artifactId artifactIdVal
groupId POM_GROUPID
packaging POM_PACKAGING
}
}
}
}
- 最后通过android studio 中的gradle 按钮

或者 通过命令行,在项目根目录下执行
./gradlew uploadArchives
来进行library 的上传。
library 的下载
-
依赖库的下载,相对比较简单
- 根目录
build.gradle
的相关配置
allprojects { repositories { jcenter() google() maven { url "https://jitpack.io" } //此处为项目引入提供相关配置 maven { url MC_AUDIO_RELEASE_URL credentials { username 'admin' password 'admin123' } } maven { url MC_AUDIO_SNAPSHOTS_URL credentials { username 'admin' password 'admin123' } } }
- 在需要使用的工程中,导入需要使用的library、
implementation 'com.team_5zdh.android:mc_audio_release:1.0.1'
- 根目录
这样整个仓库的流程就完全走通了
其他需要注意的知识点
release 和 snapshot 仓库的区别与正确使用
我们已经将将依赖构件上传到 release 仓库中,如果没有修改版本号,再次上传,就会上传失败,并提示如下错误:
Error:Execution failed for task ‘:nexuslibrary:uploadArchives’.
Could not publish configuration ‘archives’
Failed to deploy artifacts: Could not transfer artifact
com.dr:nexuslibrary:aar:1.0.0 from/to remote
(http://localhost:8081/repository/maven-releases/): Failed to transfer file:
http://localhost:8081/repository/maven-releases/com/dr/nexuslibrary/1.0.0/nexuslibrary-1.0.0.aar. Return code is: 400,
ReasonPhrase: Repository does not allow updating assets: maven-releases.
原因在于,release 仓库不能重复上传同一版本号,版本不能覆盖,只能迭代。
snapshot 仓库允许版本覆盖。当我上传多次上传同一个版本到 snapshot 仓库,会自动在版本号上添加时间戳来区分。
-
那么问题来了,为什么存在这两个仓库?这个区别的存在意义是什么呢?
试想你是一个三方库的开发者,三方库是对外暴露的,1.0.0 已经在为其他程序服务,同时它本身存在问题也在继续开发迭代。此刻正在开发新版本 1.0.1,公司的小伙伴在同步从 Nexus 私库下载 1.0.1 最新改动版本测试。
稳定对外开放的版本,放到 release 仓库。版本不能覆盖,保证外部使用不受版本更新的影响。
迭代开发的不稳定版本,放到 snapshot 仓库。版本可覆盖,小伙伴测试的时候,不需要修改依赖的版本号,最多需要清除下 Maven 的依赖缓存,就可以下载到最新的版本。
上面提到的 目前 maven-releases 和 maven-snapshots 是 hosted 类型的仓库是 Nexus 默认创建的两个仓库,实际工作中,我们可以自定义创建仓库,自己规定为 release 库和 snapshot 库。下面给出两者的正确使用姿势,方便以后使用:
-
release库(发布库)使用规则及场景
-
场景:
release库是存放稳定版本包的仓库,线上发布的程序都应从release库中引用正确版本进行使用。
-
使用规则:
release库仓库名中带有“releases”标识,
release 库不允许删除版本;
release 库不允许同版本覆盖;
release库上传的jar包版本号(version)不能以“-SNAPSHOT”结束(版本号中的SNAPSHOT是release版和snapshot版区别的唯一标识);
第三方包(非公司内部开发)仅可引用 release 版
最好提供源码包 sources.jar 和方法文档 javadoc.jar,方便引用方使用。
-
-
snapshot库(快照库)使用规则及场景
-
场景:
snapshot库是存放中间版本包的仓库,代表该库中依赖包的程序处于不稳定状态。当代码在开发过程中有其他程序需要引用时,可以提供snapshot版用于调试和测试。由于snapshot库的包依然处于测试状态,所以随时可以上传同版本最新包来替换旧包,基于这种不稳定状态,maven允许snapshot库中的包被编译时随时更新最新版,这就可能会导致每次打包编译时同一个版本jar会包含不同的内容,所以snapshot库中的包是不能用来发布的; -
使用规则:
snapshot 库仓库名中带有“snapshots”标识,
snapshot 库可以删除版本;
snapshot 库可以实现版本覆盖;
第三方包(非公司内部开发)不允许引用 snapshot 版
快照库上传的版本号(version)必须以“-SNAPSHOT”结束,并上传至私服后系统将自动将“-SNAPSHOT”替换为时间戳串(本地代码引用时依然用“-SNAPSHOT”结束的版本号,无需替换时间戳),一个快照包线上将存在至少两个版本。
-
网友评论