欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android和Maven仓库那些事

程序员文章站 2024-03-20 22:03:16
...

转载请注明出处: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私服就算是搭建好了,是不是非常简单啊~
Android和Maven仓库那些事

左边目录侧栏里面我们点击Repositories可以看到有一些默认仓库:
Android和Maven仓库那些事

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

我们把Releases和Snapshots添加到这个组里即可,方便我们后续使用。我们点击上面的Releases:
Android和Maven仓库那些事

可以看到这是它的一些配置,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(中划线,全大写),否则引用的时候会找不到包。
我们来看一下最终上传上去的是什么样:

Android和Maven仓库那些事

可以看到每次上传的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私有库到此就讲完了,是不是非常简单~
有疑问的同学可以在下方留言,最后放出源码下载