Android和Maven仓库那些事
转载请注明出处: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私有库到此就讲完了,是不是非常简单~
有疑问的同学可以在下方留言,最后放出源码下载