Android和Maven仓库那些事

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/binbinqq86/article/details/81033716

转载请注明出处:https://blog.csdn.net/binbinqq86/article/details/81033716

背景

当一个项目的业务线越来越多的时候,人员也会越来越多,多条业务线同时进行开发,项目也会越来越大,如果不进行统一的管理,势必会很乱,而且非本条业务线的人员不需要关心其他业务的代码,也不需要把所有代码都克隆到本地才能进行构建,不然的话就太麻烦了,而且当业务有交叉的时候,可能会随意修改别的业务的代码(当然这可以通过git的权限来解决,但始终是不好的方式)。这个时候就可以把非本条业务线的所有的模块全都做成JAR包或者AAR包,然后通过maven私服的方式,用gradle来进行构建,自动引入到本地来进行依赖和引用,当然自己的业务线也要这样做,来提供给别人去引用,如此一来,岂不美哉!

maven简介

maven是什么

Maven是一个项目管理和综合工具,基于项目对象模型(POM)的概念,可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。当然这是官方的解释,用我们自己的话来说,maven就是用来构建和管理项目的,就是一个项目的仓库,我们平时使用到的都是最基本的功能,比如自己开发了一个开源工具,秉着开源的精神,想要让全世界的人都可以去用,这个时候我们就可以上传到maven中心库,这个库是网络上的一个仓库,任何人都可以引用里面的资源,包含了非常多的开源项目。再比如我们公司内部写了一些通用组件或者工具,但是又只能内部使用,我们就可以搭建公司内部的maven服务器,把这些项目上传上去,这样整个公司所有项目都可以轻松的去引用,避免的重复编写拷贝造成的混乱和麻烦。

POM是什么

POM就是“Project Object Model”。翻译过来就是项目对象模型,里面存放的都是项目的一些基本描述信息,它是一个xml文件。maven也就是根据这个配置文件来进行项目的管理和构建的。先来看看里面到底是啥:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.tb.plugin</groupId>
  <artifactId>package-apk</artifactId>
  <version>1.0.0</version>
  <!-- 项目产生的构件类型,例如jar、war、aar、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型 --> 
  <packaging> jar </packaging> 

</project>

要注意的是,每个项目只有一个POM文件。

  • 所有的 POM 文件要项目元素必须有三个必填字段: groupId,artifactId,version
  • 在库中的项目符号是:groupId:artifactId:version
  • pom.xml 的根元素是 project,它有三个主要的子节点。
节点 描述
groupId 这是项目组的编号,这在组织或项目中通常是独一无二的。 例如,一家银行集团com.company.bank拥有所有银行相关项目。
artifactId 这是项目的ID。这通常是项目的名称。 例如,consumer-banking。 除了groupId之外,artifactId还定义了artifact在存储库中的位置。
version 这个就是项目的版本号,每次有新功能或者bug修复,可以修改版本号再去发布。

maven仓库分类

  • Maven本地资源库
    Maven 的本地资源库是用来存储项目的依赖库,默认的文件夹是 “.m2” 目录,可能需要将其更改为另一个文件夹。
  • Maven中央存储库
    Maven 中央存储库是 Maven 用来下载所有项目的依赖库的默认位置。
  • 如何从Maven远程存储库下载?,如何添加远程库?
    并非所有的库存储在Maven的中央存储库,很多时候需要添加一些远程仓库来从其他位置,而不是默认的中央存储库下载库。比如Android中用的仓库就是谷歌基于mavenCentral进行扩展的JCenter仓库,还有google仓库。

本文主要讲解本地maven仓库的搭建和在项目中的引用。

用maven搭建私服

好了,上面说了这么多废话,终于要进入今天的正题了,下面就带你一步一步搭建自己的maven私服,本文以Nexus Repository Manager为例,版本选择2.xx,下载地址:https://www.sonatype.com/download-oss-sonatype,由于我的电脑是windows,所以选择zip文件即可。下载完成后解压,找到如下目录:D:\nexus-2.14.9-01-bundle\nexus-2.14.9-01\bin\jsw,可以看到里面有很多平台可以选择,这里我选择的是
windows-x86-64,然后点击install-nexus.bat,进行服务的安装,成功之后,点击start-nexus.bat启动服务,然后在浏览器输入http://localhost:8081/nexus即可访问。我们点击右上角的Log In,输入默认的用户名密码:admin,admin123,到此maven私服就算是搭建好了,是不是非常简单啊~
这里写图片描述

左边目录侧栏里面我们点击Repositories可以看到有一些默认仓库:
这里写图片描述

其中就包含了默认的Releases和Snapshots,这也是我们上传项目和引用所需要的地方,当然这个是默认的,我们也可以添加自己的,点击图中的Add按钮,选择group就可以添加一个组了,默认的组是public,图中我添加了tb的组:
这里写图片描述

我们把Releases和Snapshots添加到这个组里即可,方便我们后续使用。我们点击上面的Releases:
这里写图片描述

可以看到这是它的一些配置,release我们默认不允许重复deploy,所以选择的Disable Redeploy,其他选项看字面意思也很容易理解,而snapshot这一项就是Allow Redeploy,其他都是一样的,这里不做深入介绍了。

上传Android项目到maven库

那么怎么去上传我们的项目到这个maven私服呢,直接上代码(以我们上一篇中的gradle插件项目为例,传送门):

apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

uploadArchives {
    repositories {
        mavenDeployer {
            pom.groupId = 'com.tb.plugin'
            pom.artifactId = 'package-apk'
            //最后必须是-SNAPSHOT
            pom.version = IS_PUBLISH.toBoolean() ? VERSION : VERSION + '-SNAPSHOT'

            //传到本地目录
            //repository(url: uri('../tplugins'))
            //传到本地maven私服
            repository(url: IS_PUBLISH.toBoolean() ? 'http://localhost:8081/nexus/content/repositories/releases/' : 'http://localhost:8081/nexus/content/repositories/snapshots/') {
                authentication(userName: 'admin', password: 'admin123')
            }
        }
    }
}

上一篇文章中我们把插件传到了本地的maven仓库,这里相比,改动的仅仅是maven地址,由本地改为私服地址,这个地址可以在上图中找到,就是仓库后面的那一串地址。另外为了方便配置,我们这里在gradle.properties文件中加入了两个变量来控制上传:

IS_PUBLISH = false
VERSION = 1.0.0

一般情况下,我们在开发阶段由于要频繁修改代码,所以要用snapshot版本的包,也就是开发包,而最终上线的时候才去上传release的包,这样就不需要频繁改动版本号了,其他引用人员也无需任何变动,只要我们改动后upload一下,别人就能引用我们的最新包了,这里需要在工程的gradle文件中配置一下缓存策略来保证每次都是从maven仓库拉取最新的snapshot包,而不是上一次缓存的:

allprojects {
    repositories {
        google()
        jcenter()
    }
    configurations.all {
        resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
    }
}

这样所有的模块都不需做任何改动,就能实时拉取最新的包,非常方便。

注意:snapshot版本的版本号后面必须加上-SNAPSHOT(中划线,全大写),否则引用的时候会找不到包。
我们来看一下最终上传上去的是什么样:

这里写图片描述

可以看到每次上传的snapshot都在这里保存着,并且按照时间进行排列,maven会自动引用最新的包对于同一个版本号,是不是非常牛逼~

引用maven库

做了这么多工作,终于可以引用我们的jar/aar包了,看代码:

buildscript {
    apply from: "version.gradle"

    repositories {
        google()
        jcenter()
//        maven{
//            url './tplugins'
//        }
//        maven{
//            url 'http://localhost:8081/nexus/content/repositories/releases/'
//        }
//        maven{
//            url 'http://localhost:8081/nexus/content/repositories/snapshots/'
//        }
//        maven{
//            //默认的public组,包含全部默认的仓库
//            url 'http://localhost:8081/nexus/content/groups/public'
//        }
        maven{
            //自己创建的组,包含release和snapshot
            url 'http://localhost:8081/nexus/content/groups/tb'
        }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:$androidGradleVersion"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.tb.plugin:package-apk:1.0.0-SNAPSHOT'
    }
}

apply plugin: 'com.tb.plugin.package-apk'

可以看到,我们写了release和snapshot两个地址,这是非常不方便的,所以有了一开始组的概念,这样我们最终只需要引入一个组的地址即可,里面包含了该组所有的仓库,classpath里面引入snapshot必须加入-SNAPSHOT,最后一行引入我们的插件,编译一下,完美通过。

最后

整个Android中上传和引用maven私有库到此就讲完了,是不是非常简单~
有疑问的同学可以在下方留言,最后放出源码下载

猜你喜欢

转载自blog.csdn.net/binbinqq86/article/details/81033716