Android 打包上传Maven库

一.Maven私服搭建

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

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

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

    • 方式一:nexus.exe /run命令启动
      启动成功:
    • 方式二:安装nexus本地服务来启动(推荐
      安装命令:nexus.exe /install nexus3
      安装成功:

      启动nexus服务:nexus.exe /start nexus3
      启动nexus服务:nexus.exe /stop nexus3

4.访问nexus私服

二.nexus仓库

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

三.版本上传

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



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

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

关于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下,可以看到依赖已经加入项目中:

五.发布到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上传

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

推荐阅读更多精彩内容