Android Studio如何发布项目到Maven仓库

一般地将 Android Library 打包成 aar 文件后,需要发布到 Maven 仓库中供他人使用,这里有两种发布场景:

  • 个人开源项目,发布到 Maven Central 仓库或 JCenter 仓库;
  • 公司内部使用,一般公司会搭建私有 Maven 仓库(使用 nexus 搭建),把包发布到私有 Maven 仓库。
方式一:使用Nexus搭建Maven私有仓库

第一步:官网下载最新安装包 nexus-3.7.1-02-mac,解压后配置环境变量;
第二步:使用命令 nexus start 启动服务(nexus stop结束);
第三步:进入 nexus 界面:http://127.0.0.1:8081/nexus(无法打开,换成自己的ip地址打开);
第四步:使用管理员用户登录(用户名:admin,密码:admin123);
第五步:找到左侧 Browser ,右侧会展示不同形式的 maven 仓库地址。

发布到Maven私有仓库

第一步:编写 maven upload 脚本 nexus-push.gradle 置于lib gradle文件同级目录;

apply plugin: 'maven'

task androidJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
    classifier = 'javadoc'
    from androidJavadocs.destinationDir
}

task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}

artifacts {
    archives androidSourcesJar
    archives androidJavadocsJar
}

uploadArchives {
    repositories {
        mavenDeployer {
            // 这里仓库地址可改成自己需要的
            repository(url: "http://127.0.0.1:8081/nexus/repository/maven-releases/") {
                // 这里的用户名和密码需要写在local.properties
                authentication(userName: "deployment", password: "deployment123")
            }

            pom.groupId = 'com.coral.banner'
            pom.artifactId = 'bannerwrapperview'
            pom.version = '0.0.1'

            pom.project {
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
            }
        }
    }
}

// 上传到内部私服maven仓库(nexus搭建)命令:gradle uploadArchives

第二步:在 library 目录下的 build.gradle 文件末尾添加上述maven脚本引用(Tips:添加到顶部会因为 compileSakVersion无法编译);

......
apply from: './nexus-push.gradle'

第三步:命令行键入命令 gradle uploadArchives,开始打包上传,build successful 后,到 nexus 页面,找到脚本中 repository 定义的 url http://127.0.0.1:8081/nexus/repository/maven-releases/,点击 browser -> maven-release,可以看到已发布的项目;

nexus maven upload.png

第四步:内部项目引入配置;

// 1. 项目根gradle文件添加 maven 仓库地址
allprojects {
    repositories {
        jcenter()

        // 1. 发布到本地nexus私服
        maven {
            url "http://电脑IP:8081/nexus/repository/maven-releases/"
        }
    }
}

// 2. app 或者其他需要引入的项目 gradle 文件中添加依赖:
compile 'com.coral.banner:bannerwrapperview:0.0.1'

方式二:发布到JCenter仓库

第一步:注册 bintray 账户并在用户中心获取用户名和Api key(Tips:必须使用 gmail 账户注册,另外在注册时注意注册个人账号,organization账户需付费免费使用30天,若不小心注册成组织账户,重新开gmail账户注册);

第二步:到 https://bintray.com 网站 Add New Repository 创建新仓库,一般选择 type 为 Maven;

第三步: 选择新建的 Maven 仓库,Add New Package,
输入稍后要 upload 的项目 git 地址和描述信息;

第四步:New Version 添加版本号;

第五步:在需要发布的 module 下添加 jcenter-push.gradle 文件配置发布信息;

apply plugin: 'com.jfrog.bintray'
apply plugin: 'com.github.dcendents.android-maven'

def siteUrl = 'https://github.com/CoralXss/CommonBannerView'
def gitUrl = 'https://github.com/CoralXss/CommonBannerView.git'

group = 'com.coral.banner'
version = '1.0.0'

install {
    repositories.mavenInstaller {
        pom {
            project {
                packaging 'aar'
                groupId 'com.coral.banner'
                artifactId 'bannerwrapperview'

                // Add your description here
                name 'banner'
                description 'custom common bannerview for android'
                url siteUrl

                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }

                developers {
                    developer {
                        id '用户名'
                        name '用户名'
                        email '你的@gmail.com'
                    }
                }

                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }

        }
    }
}

task androidJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
    classifier = 'javadoc'
    from androidJavadocs.destinationDir
}

task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}

artifacts {
    archives androidSourcesJar
    archives androidJavadocsJar
}

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

bintray {
    // local.property 文件下配置bintray用户名和apiKey
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    configurations = ['archives']
    pkg {
        version {
            name = libVersion
            desc = 'custom common bannerview'
        }
        repo = 'maven'
        name = 'CommonBannerView'
        licenses = ['Apache-2.0']
        vcsUrl = gitUrl
        publish = true
    }
}

// 上传到 jcenter : gradle bintrayUpload

第五步:在根目录 gradle 文件中添加 bintray 发布项目插件配置:

dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
    }

第六步:在 library 目录下的 build.gradle 文件末尾添加上述maven脚本引用;

......
apply from: './jcenter-push.gradle'

第七步:终端依次执行以下命令将项目发布到 bintray 下 maven 仓库;

./gradlew install
./gradlew bintrayUpload

第八步:build 成功后,刷新网页,可以看到项目上传到 maven 仓库,并且生成配置信息:

<dependency>
  <groupId>com.coral.banner</groupId>
  <artifactId>bannerwrapperview</artifactId>
  <version>1.0.0</version>
  <type>pom</type>
</dependency>

第九步:将 bintray 下的 maven 仓库 include 到 JCenter 仓库,点击右侧 Add to JCenter 按钮,填上 message 信息,最后send。之后就是等待人工审核结果,审核通过会收到站内消息。

通过后根据配置信息,可在项目中进行引用。编译时,gradle会自动从 JCenter 仓库下载对应的依赖包到本地项目中。引用形式如下:

compile 'com.coral.banner:bannerwrapperview:1.0.0'

Tips:这里在上传时可能存在 http/1.1 401 unauthorized 问题

  • 原因之一,local.property 文件中配置的账号和apikey信息错误;
  • 原因之二,个人猜测是 .gradle 中的配置同 bintray对应仓库信息配置不一致导致上传失败。

参考:

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

推荐阅读更多精彩内容