[Gradle系列]Gradle发布module(maven)到

作者: Tamic | 来源:发表于2016-11-18 23:14 被阅读3372次

    Tamic : http://www.jianshu.com/users/3bbb1ddf4fd5/

    前言


    Android开发者经常会看到xx公司发布了xx项目,xx公司提供了gradle配置路径,我们就能轻松的使用它们的项目到自己的工程中:

    譬如:

    谷歌自身的库

    compile 'com.android.support:appcompat-v7:22.2.0'

    第三方库

    compile 'com.squareup.okhttp:okhttp:2.7.2'

    很多开发者看过之后羡慕不已, 想自己能不能也写一个自己的库让别人用(或者发布已有的本地module库),或者当多模块开发时,为了进行版本协作,使用自己的maven库是势在必得的!

    Maven

    Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
    更多请点击:Maven

    Maven package 是由所谓 POM(Project Object Model)所定义的文件包的一种输出特殊格式。

    Maven仓库就是,就是放 Maven包的地方, 所以叫仓库。 这些仓库,可以是放在本地,也可以放在远程服务器上。 可以开放仓库,也可以加密的,提供别人下载使用!

    一句大白话你就懂了:maven是类似android studio的构建工具, maven包是对于构建工具产出的格式,maven包类似是apk,maven仓库是apk应用市场一样!

    Maven仓库


    Center和MavenCentral

    jcenter是由 bintray.com提供的Maven仓库存放的平台服务器,用户可以注册发布托管自己的开源maven包

    Maven Central 是由sonatype.org 提供的发布的Maven服务平台。虽然Maven Central和jcenter都是标准的maven仓库服务器。

    同样的仓库却毫无联系。 在jcenter上存在的开源库,可能 在Maven Central 上并不存在,反之亦然。 就类似豌豆荚和91助手都可以存在apk下载,但不一定都能搜到同一个应用一样,MavenCentral上发布maven包比发布到jcente有点复杂,当然我们可以将jcenter的包同步到MavenCenter

    发布maven包


    远程jcenter

    Maven

    一首先我们需要在jcenter注册一个账号 点我注册

    这里写图片描述

    如果你有github直接可以用github账户注册! 然后补充下资料信息!

    接着登录成功后我们去获取这个账户的签名key,用来区分账户Id信息,先记录好自己的
    key,后面会用到这个信息。

    这里写图片描述

    创建module

    • 1 创建模块

    如果你是从零开始去写一个组件模块,就直接在as为你的app创建一个
    module, 如果已有模块请直接绕道到第三步。

    这里写图片描述

    当创建好你的module是时候就会生成一个自己的library

    接着可以在自己module配置gradle

    这里写图片描述

    下面步骤请均在自己的module中gradle中配置加入。

    • 3 申明插件类型
         apply plugin: 'com.github.dcendents.android-maven'
         apply plugin: 'com.jfrog.bintray'
    
    • 4 配置maven包信息

        //版本号
        version = "1.0.0"
        //这是项目首页
        def siteUrl = 'https://github.com/NeglectedByBoss/Novate'
        //这是源码地址
        def gitUrl = 'https://github.com/NeglectedByBoss/Novate.git'
        // 包名,可以写公司的前缀
        group = "com.tamic.novate"
      
    • 5 定制输出格式信息

            install {
           repositories.mavenInstaller {
          // This generates POM.xml with proper parameters
         pom {
             //pom信息
             project {
              packaging 'aar'
             // Add your description here
              name 'novate'
              url siteUrl
             // Set your license
        licenses {
          //开源协议
           license {
             name 'The Apache Software License, Version 2.0'
              url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                  }
                 }
        developers {
          //开发者基本信息
            developer {
            id 'tamic'
            name 'tamic'
            email 'xxxx@xxx.com'
                      }
                  }
      
             scm {
                connection gitUrl
                developerConnection gitUrl
                url siteUrl
                 }
               }
           }
         }
        }
      
    • 6 输出资源

        task sourcesJar(type: Jar) {
        from android.sourceSets.main.java.srcDirs
          classifier = 'sources'
         }
         task javadoc(type: Javadoc) {
          source = android.sourceSets.main.java.srcDirs
          classpath += project.files(android.getBootClasspath   ().join(File.pathSeparator))
        }
        task javadocJar(type: Jar, dependsOn: javadoc) {
            classifier = 'javadoc'
           from javadoc.destinationDir
         }
         artifacts {
         archives javadocJar
         archives sourcesJar
         }
    
    • 7 配置账号

      这时候加入自己的账号和key,当然你不想加入到local配置中,也可以单独建个prpertites文件,设置git的忽略规则即可。

      这里写图片描述
    • 8 申明编译类型

      在主项目的gradle中加入下面申明

          buildscript {
          repositories {
          jcenter()
      
         }
         dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
        //这里是依赖的插件类型路径,用最新的即可
         classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
         classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
         }
        }
      

    提交maven

    当我们将项目build完成以后,as就会生成如下task

    这里写图片描述

    双击即可,也可以在命令行输入 gradle brntaryUpload.

    如果成功了,可以去预览我们的项目,发现会有你发布的包了,我这里有四个项目,如果第一次用只显示一个,直接点击预览自己的Maven包 ,

    这里写图片描述

    接着继续打开后发现maven包具体预览界面了,

    这里写图片描述

    这时候需要add到仓库中心等管理员审核,如果第一次就会有addjcenter按钮,

    这里写图片描述

    提交会打开一个申请页面,你填写评论就Okle ,中文也可以,等一两小时,收到系统发来的私信,就代表你的库成功了,这时候就有maven依赖地址生成,我们可以直接拿来配置就可以了

    这里写图片描述
    • 9 使用mven包

      这个就不用多说了吧,心累!

    问题总结

    如果发现提示你javadoc不过,就关闭doc检查,

    这里写图片描述

    如果发现编码出错,就指定utf-8

    在module的gradle中加入

      javadoc {
    options{
    encoding "UTF-8"
    charSet 'UTF-8'
    author true
    version true
    links "http://docs.oracle.com/javase/7/docs/api"
    }
    }
    
    tasks.withType(Javadoc) {
    options.addStringOption('Xdoclint:none', '-quiet')
    options.addStringOption('encoding', 'UTF-8')
    options.addStringOption('charSet', 'UTF-8')
    }
    

    如果希望自己代码混淆请配置好相关规则,这里不再介绍。

    Maven Central

    可能很多人还想发布到 Maven Central去,可以接着看,虽然长了点,请仔细耐心看完

    这里写图片描述
    • 创建 issue

      登陆之后,顶部有按钮,Created,下面是关键的条目

      Project: Community Support - Open Source Project Repository Hosting (OSSRH)
      Issue Type: New Project
      Group Id:就是你的包的 groupId

    其他信息请加上,提交之后,大概两个工作日, 等系统给你分配了issue之后,就可以进行下面的工作了,这块可以参考 点击介绍

    • 上传包

      配置gradle

      整个结构,

      这里写图片描述

      现在我们将红框内的task覆盖,具体如下

        ext {
          PROJ_GROUPID = 'com.tamic.android'
          PROJ_ARTIFACTID = 'novate' //这是项目名字
           PROJ_VERSION_NAME = "1.0.0"//版本号
      
           POM_PACKAGING = 'aar'
      
          NEXUS_USERNAME = '注册的账号'
          NEXUS_PASSWORD = '这是密码'
          RELEASE_REPOSITORY_URL = '这里是sonatye配置好的线上路径'
           SNAPSHOT_REPOSITORY_URL = '这里是在 sonatye配置好的snaphot路径'
       }
      
        uploadArchives {
      
        repositories {
        mavenDeployer {
            snapshotRepository(url: SNAPSHOT_REPOSITORY_URL) {
                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
            }
            repository(url: RELEASE_REPOSITORY_URL) {
                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
            }
      
            pom.project {
                version PROJ_VERSION_NAME
                groupId PROJ_GROUPID
                artifactId PROJ_ARTIFACTID
                packaging 'aar'
      
             }
      
          }
      

      }

      当然密码可以加载jcenter公用的那个properties文件中,防止上传的代码git上,
      
       然后运行as命令,或点击下面这个task即可。
      
    这里写图片描述

    发布maven包

    登陆 oss sonatype,登陆,选择左边栏里的 Staging Repositories, 然后点Close 按钮,sonatype 会做响应的 validation,通过的话,就可以点 Release 发布啦,如果不通过,就检查问题,先 Drop,并重新做 Staging 发布。

    检查包

    https://oss.sonatype.org/content/repositories/releases 可以看到你发布的包。

    两者同步

    如果你觉得这种方式比较麻烦,那么我们可以将JCenter的项目同步MavenCentral到上,

    这里写图片描述

    搭建企业maven私服

    在项目庞大情况下,可能你的项目依赖的module越来越多,这样对版本控制越来越难,大家想push到maven库上,但又不想公开自己的maven包,所以MavenCentral提供了自己的企业私服,Sonatype 提供了免费的 sonatype/nexus。

    请忽略 作者: http://blog.csdn.net/sk719887916

    下载安装 docker 镜像

      $ docker pull sonatype/nexus
    

    开启服务镜像

      $ docker run -d -p 8081:8089 --name nexus sonatype/nexus:oss
    

    访问服务器

    因为的 docker-machine ip 是:192.168.99.100,于是可以通过在浏览器访问http://192.168.99.100:8089/ 这个 URL 来访问 sonatype 私服。
    条件允许的可以在内网部署一台服务器,用来运行这个maven私服。甚至找运维可以创建自己的Maven域名

    默认账户密码是:

      admin
     admin123
    

    配置仓库

    点击左侧 repository,会出现 repository 的列表,把其中的 Releases 的 Configutation->Access Setting-> Deploy Polocy 设置成 Allow Redeploy 使得可以重复发布包。

    配置上传插件

    因为使用了自己的私服 chrisbanes/gradle-mvn-push 插件,要稍微改动,我们需要修改自己的maven私服repository URL 等,

    关键设置

       ext {
    PROJ_GROUPID = 'com.tamic.android'
    PROJ_ARTIFACTID = 'android_statSdk'
    PROJ_VERSION_NAME = "1.0.0"
    
    POM_PACKAGING = 'aar'
    
    NEXUS_USERNAME = 'admin'
    NEXUS_PASSWORD = 'admin123'
    RELEASE_REPOSITORY_URL = '修改为你配置的路径'
    SNAPSHOT_REPOSITORY_URL = '修改为你配置的路径'
    }
    

    检测是否成功

    上传成功之后,就可以在浏览器的http://192.168.99.100:8089/content/repositories/releases看到这个包。发现存在,说明已经成功了。

    这里写图片描述

    使用

    指定自己的mven仓库地址

    这里写图片描述

    在root的gradle指定你的maven服务器路径就ok了,其他moudule配置和使用第三方库一样。

    发布本地Maven##

    有时候你不想发布到自己公司的内网私服上,只想测试下本地打包机制,这时候随便找个mven包,反到电脑任意路径下。指定本地路径就ok了,下面三种可以随你选择

    allprojects {
        repositories {
         //本机仓库
         mavenLocal()
         
        //内网maven仓库
        maven {  url "你的内网私服地址"  }
        maven {
                      
            url "你的Maven路径"
        }
    }
    

    }

    经验采坑

    • 上传失败,返回400,可能是Configutation->Access Setting-> Deploy Polocy没设置好;返回401,可能是账号密码错误。
    • 如果还出现失败,请检版本号是否一致,如果服务器存在的版本号会上传不了,请先删除就版本再上传,

    • 如果出现NOT found you moudle无法上传情况,请只保留一个android STUDIO,在点击上传task.

    • 编译不过出现 无效的插件类型,请重新升级maven-gradle-plugin版本:1.4.1或者更高

    华丽结束


    上面展示了两种发布maven包到仓库的方式,开发者可以自我去选择,maven不仅很好的解决了模块化开发是带来的版本控制问题,也方便了项目对依赖的旧版本回滚控制, 具体在使用的地方可以自己指定maven版本,这次介绍了怎么在gradle发布maven的姿势,下节在总结下在多模块情况下,开发者想用同一套代码,生成不同apk,设置可以选择不同资源打包的问题。 gradle多渠道和多版本打包相关的知识,期待你的关注!


    [Gradle系列]Gradle发布module(maven)到jcenter, 并构建自己的企业Maven私服

    Tamic : http://www.jianshu.com/users/3bbb1ddf4fd5/

    相关文章

      网友评论

      • 3b5a63689539:大佬.想问下,为什么按你的步骤来.然后执行task的时候,说找不到程序包(sdk中的一些第三方依赖库),还有找不到符号R,找不到类什么的...
      • Even3Yu:写的详细
      • ab917d60b572:不错,学习了
        Tamic:@疯子Android :blush:

      本文标题:[Gradle系列]Gradle发布module(maven)到

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