美文网首页Android进阶
Android Studio如何发布项目到Maven仓库

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

作者: Coralline_xss | 来源:发表于2018-01-30 23:03 被阅读48次

    一般地将 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://10.12.39.157: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对应仓库信息配置不一致导致上传失败。

    参考:

    相关文章

      网友评论

        本文标题:Android Studio如何发布项目到Maven仓库

        本文链接:https://www.haomeiwen.com/subject/wkmhzxtx.html