Android 打包上传Maven库

一.Maven私服搭建

  1. 下载nexus3
    地址:https://www.sonatype.com/download-oss-sonatype
    windows系统:

    《Android 打包上传Maven库》

  2. 修改配置
    解压下载包到:F:\MavenCenter\nexus-3.15.2-01-win64
    修改文件位置:...\nexus-3.15.2-01\etc文件夹下nexus-default.properties
    修改主机和端口配置:

    《Android 打包上传Maven库》

  3. 启动nexus服务
    ...\bin目录下,以管理员身份启动cmd

    • 方式一:nexus.exe /run命令启动
      启动成功:
      《Android 打包上传Maven库》
    • 方式二:安装nexus本地服务来启动(推荐
      安装命令:nexus.exe /install nexus3
      安装成功:
      《Android 打包上传Maven库》
      启动nexus服务:nexus.exe /start nexus3
      启动nexus服务:nexus.exe /stop nexus3

4.访问nexus私服

二.nexus仓库

仓库名作用
hosted(宿主仓库)存放本公司开发的版本(正式版本、测试版本)
proxy(代理仓库)代理中央仓库、Apache库
group(组仓库)使用时连接组仓库,包含Hosted(宿主仓库)和Proxy(代理仓库)
virtual (虚拟仓库)基本用不到,重点关注上面三个仓库的使用

《Android 打包上传Maven库》

三.版本上传

  1. 可以本地生成jar或者aar,通过图形化用户界面上面

    《Android 打包上传Maven库》

    这个没啥可说明,按照界面提示上传就行

  2. 通过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
提示成功说明已经上传到了你的私库中
看下私库,如下表示上传成功

《Android 打包上传Maven库》

关于POM文件配置

四.仓库版本使用

使用和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下,可以看到依赖已经加入项目中:
《Android 打包上传Maven库》

五.发布到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'
}

参考文章
Android 打包上传AAR文件到本地Maven仓库并且引用
maven私服搭建及gradle上传

    原文作者:limushan
    原文地址: https://www.jianshu.com/p/8018372d272c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞