一.Maven私服搭建
-
下载nexus3
地址:https://www.sonatype.com/download-oss-sonatype
windows系统:
-
修改配置
解压下载包到:F:\MavenCenter\nexus-3.15.2-01-win64
修改文件位置:...\nexus-3.15.2-01\etc
文件夹下nexus-default.properties
修改主机和端口配置:
-
启动nexus服务
在...\bin
目录下,以管理员身份启动cmd- 方式一:
nexus.exe /run
命令启动
启动成功:
- 方式二:安装nexus本地服务来启动(推荐)
安装命令:nexus.exe /install nexus3
安装成功:
启动nexus服务:nexus.exe /start nexus3
启动nexus服务:nexus.exe /stop nexus3
- 方式一:
4.访问nexus私服
- 浏览器打开:http://127.0.0.1:8081/
-
登录,默认用户名和密码为:admin/admin123
二.nexus仓库
仓库名 | 作用 |
---|---|
hosted(宿主仓库) | 存放本公司开发的版本(正式版本、测试版本) |
proxy(代理仓库) | 代理中央仓库、Apache库 |
group(组仓库) | 使用时连接组仓库,包含Hosted(宿主仓库)和Proxy(代理仓库) |
virtual (虚拟仓库) | 基本用不到,重点关注上面三个仓库的使用 |
三.版本上传
-
可以本地生成jar或者aar,通过图形化用户界面上面
这个没啥可说明,按照界面提示上传就行
通过gradle命令上传
在Module的build.gradle 添加如下脚本
apply plugin: 'maven'
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = GROUP_ID
pom.artifactId = ARTIFACT_ID
pom.version = VERSION
repository(url: RELEASE_REPOSITORY_URL) {
authentication(userName: USERNAME, password: PASSWORD)
}
}
}
}
然后执行 gradlew uploadArchives
任务上传AAR
为了方便维护,这里在Module目录新建一个脚本push.gradle
,然后将上传Maven库的脚本抽离到push.gradle
,最后在build.gradle
中通过apply from: push.gradle
引入。
具体代码如下:
push.gradle:
//支持将项目发布到maven仓库的插件
apply plugin: 'maven'
//支持对库文件数字签名的插件,可以通过签名知道文件的创建者,创建时间等信息
apply plugin: 'signing'
//声明变量记录上传Maven库地址
def repositoryUrl
//判断发到正式库还是snapshot库
if (isReleaseBuild()) {
println 'Release Build'
//上传Release私有仓库
repositoryUrl = "http://127.0.0.1:8081/repository/maven-releases/"
} else {
println 'Debug Build'
//上传snapshot私有仓库
repositoryUrl = "http://127.0.0.1:8081/repository/maven-snapshots/"
}
//从项目gradle.properties中读取Nexus服务器登录用户名
def getRepositoryUserName() {
return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}
//读取Nexus服务器登录密码
def getRepositoryPassword() {
return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}
//通过gradle.properties中VERSION_NAME常量判断是否是Release版本
def isReleaseBuild() {
return !VERSION_NAME.contains("SNAPSHOT")
}
//配置阶段要结束,项目评估完会走到这一步
afterEvaluate { project ->
//声明上传Maven的Task
uploadArchives {
repositories {
mavenDeployer {
//签名POM
beforeDeployment {
MavenDeployment deployment -> signing.signPom(deployment)
}
//构件标识符
pom.artifactId = POM_ARTIFACT_ID
//全球唯一标识符
pom.groupId = POM_GROUP_ID
//构件版本
pom.version = VERSION_NAME
//用户名和密码授权验证
repository(url: repositoryUrl) {
authentication(userName: getRepositoryUserName(), password: getRepositoryPassword())
}
//配置pom.xml
pom.project {
//库名称
name POM_NAME
//打包下载上传的格式
packaging POM_PACKAGING
//描述信息
description POM_DESCRIPTION
//项目地址
url POM_URL
//scm(software configuration management)标签允许你配置你的代码库
//不用SCM可忽略,随意配置
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
//软件许可证书信息
licenses {
license {
//license用于法律上的名称
name POM_LICENCE_NAME
//官方的license正文页面的URL
url POM_LICENCE_URL
//<!--项目分发的主要方式: repo,可以从Maven库下载
//manual, 用户必须手动下载和安装依赖-->
distribution POM_LICENCE_DIST
}
}
//开发者信息
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
}
}
}
}
}
}
// 进行数字签名
signing {
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
// type显示指定任务类型或任务, 这里指定要执行Javadoc这个task,这个task在gradle中已经定义
task androidJavadocs(type: Javadoc) {
// 设置源码所在的位置
source = android.sourceSets.main.java.sourceFiles
}
// 生成javadoc.jar
task androidJavadocsJar(type: Jar) {
// 指定文档名称
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
// 生成sources.jar
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
// 产生相关配置文件的任务
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
}
build.gradle
apply from: 'push.gradle'
gradle.properties文件:
# nexus服务器登陆时候的用户名/密码
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123
# 在POM文件中使用的group ID
POM_GROUP_ID=com.limushan.test
# POM文件中指向你网站的地址
POM_URL=https://github.com/limushan
# SCM是指版本管理工具
POM_SCM_URL=https://github.com/
POM_SCM_CONNECTION=https://github.com/limushan
POM_SCM_DEV_CONNECTION=https://github.com/limushan
# 你的开放协议相关信息
POM_LICENCE_NAME= The Apache License, Version 2.0
POM_LICENCE_URL= http://www.apache.org/licenses/LICENSE-2.0.txt
#POM_LICENCE_URL= https://github.com/facebook/react-native/blob/master/LICENSE
#POM_LICENCE_NAME= BSD License
POM_LICENCE_DIST=repo
# 开发者的相关信息
POM_DEVELOPER_ID=limushan
POM_DEVELOPER_NAME=limushan
# 库名称
POM_NAME=TEST Library
# artifactId
POM_ARTIFACT_ID=test
# 库的打包格式为aar, 常见的还有jar
POM_PACKAGING=aar
# 库的描述,说明他是干啥的
POM_DESCRIPTION=upload maven test
# 要发布的版本好,snapshots 版本可以使用格式 1.0.0-SNAPSHOT
VERSION_NAME=1.0.0
Terminal中输入命令gradlew uploadArchives
提示成功说明已经上传到了你的私库中
看下私库,如下表示上传成功
四.仓库版本使用
使用和MavenCenter库的使用规则一样
- 在Project的
build.gradle
配置Maven库地址(这里可以直接使用组仓库地址,因为组仓库配置了成员包含release和snapshot两个私库)
allprojects {
repositories {
//...
maven {
url 'http://127.0.0.1:8081/repository/maven-public/'
}
//...
}
}
- 在module的
build.gradle
配置依赖库
dependencies {
implementation ('com.limushan.test:test:1.0.0')
}
build下,可以看到依赖已经加入项目中:五.发布到MevenCenter库
发布到Meven 中央仓库,流程和发布到 私库类似,最后多一个发布流程
具体可参考下面的文章:发布开源项目到Maven 中心仓库
六.依赖更新
项目依赖的相同版本远程包如果有更新,会有提醒或者自动更新吗?
答案是不会的,在执行build、compile等任务时会解析项目配置的依赖并按照配置的仓库去搜寻下载这些依赖。默认情况下,Gradle会依照Gradle缓存(默认缓存位置:.../.gradle/caches
目录下)->你配置的仓库的顺序依次搜寻这些依赖,并且一旦找到就会停止搜索。如果想要忽略本地缓存每次都进行远程检索可以通过在执行命令时添加--refresh-dependencies参数来强制刷新依赖。
gradlew build --refresh-dependencies
还可以通过下面的方法为缓存指定一个时效去检查远程仓库的依赖版本(只对SNAPSHOT(changing)和+号(dynamic)版本,默认是24小时自动更新。)
configurations.all {
//每隔1分钟检查远程依赖是否存在更新
resolutionStrategy.cacheChangingModulesFor 1, 'minutes'
// 采用动态版本声明的依赖缓存1分钟
resolutionStrategy.cacheDynamicVersionsFor 1, 'minutes'
}