Android业务组件化之Gradle和Sonatype Nexus搭建私有maven仓库
前言:
公司的业务组件化推进的已经差不多三四个月的时间了,各个业务组件之间的解耦工作已经基本完成,各个业务组件以module的形式存在项目中,然后项目依赖本地的module,多少有点不太利于项目的并行开发维护了,本质原因就是如果是依赖本地的,必须要将依赖的module和主工程放在一个project里面,这就导致了每个project都需要配置这些依赖关系,如果是公司内多个工程依赖同一个公司内部的业务组件,业务组件有更新时,同步非常麻烦,但公司内部的业务组件不可能部署到公有maven服务器上,所以有必要搭建一个局域网内的maven服务器,方便管理公司内部的公共库及业务组件,通过查阅资料和技术预研确定采用Gradle和Sonatype Nexus搭建私有maven仓库的方式,今天总结一下如何搭建整套集成环境及简单的使用。下图简单示例一下现在的项目结构:
业务组件化相关博客:
- Android业务组件化之现状分析与探讨
- Android业务组件化之URL Scheme使用
- Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现
- Android业务组件化之Gradle和Sonatype Nexus搭建私有maven仓库
什么是Maven?
Maven 是一个项目管理和自动构建工具。Maven 包集中存放的地方,就是 Maven 仓库。这些仓库,可以是放在本地,也可以放在某个远程服务器上。 可以是私有仓库,也可以是公开的。在Android上的使用方式如下
allprojects {
repositories {
mavenCentral();
jcenter()
maven {
url 'file:///Users/my-user-name/Documents/Android/repo/'
}
maven {
url 'http://localhost:8081/nexus/content/repositories/releases/'
}
}
}
什么是Gradle?
Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。
Android支持的Maven仓库:
- mavenCentral 是最早的 maven 中央仓库
- jcenter 是 Android Studio 0.8 版本起的默认 maven 中央仓库
- 本机的仓库
- 部署在内网服务器的私有仓库
使用Nexus搭建 maven 私服
1.下载Nexus
下载地址:http://www.sonatype.org/nexus/go
2.启动Nexus
我这里下载的All platforms - Nexus Repository Manager OSS 2.x - bundle.zip,下载完成之后,解压后进入\nexus-2.1.2-bundle\nexus-2.1.2\bin\jsw\,根据不同的系统选择不同的文件夹进入,文件夹目录结构如下:
我这里选择的是windows-x86-64,大致里面有这几个操作项
- console-nexus 启动nexus并开启控制台
- install-nexus 将nexus安装成系统服务
- start-nexus 开始nexus服务
- stop-nexus 停止nexus服务
- uninstall-nexus 卸载nexus系统服务
双击console-nexus.bat运行。再浏览器中输入http://127.0.0.1:8081/nexus/,如下图所示就代表nexus已经启动成功了。
8081是默认的端口号,要修改端口号,进入\conf\打开nexus.properties文件,修改application-port属性值就可以了。 默认的用户名和密码分别是:admin和admin123。
3.Nexus仓库
仓库类型:
- hosted(宿主仓库):用来部署自己,第三方或者公共仓库的构件
- proxy(代理仓库):代理远程仓库
- virtual(虚拟仓库):默认提供了一个 Central M1虚拟仓库 用来将maven 2适配为maven 1
- group(仓库组):统一管理多个仓库
Public Repositories: 仓库组
- 3rd party: 无法从公共仓库获得的第三方发布版本的构件仓库
- Apache Snapshots: 用了代理ApacheMaven仓库快照版本的构件仓库
- Central: 用来代理maven中央仓库中发布版本构件的仓库
- Central M1 shadow: 用于提供中央仓库中M1格式的发布版本的构件镜像仓库
- Codehaus Snapshots: 用来代理CodehausMaven 仓库的快照版本构件的仓库
- Releases: 用来部署管理内部的发布版本构件的宿主类型仓库
- Snapshots:用来部署管理内部的快照版本构件的宿主类型仓库
4.创建宿主仓库
新建公司的内部仓库,步骤为Repositories –> Add –> Hosted Repository,在页面的下半部分输入框中填入Repository ID和Repository Name即可,比如分别填入zfy 和 zfy repostiory,另外把Deployment Policy设置为Allow Redeploy,点击save就创建完成了。这里我点击添加宿主类型的仓库,在仓库列表的下方会出现新增仓库的配置,如下所示:
点击save按钮后就会在仓库列表中看到刚才新增的仓库。
Android 依赖包 AAR
1.什么是AAR
AAR文件是Google为Android开发所设计的一种library格式,全名为Android Archive Library, 与Java Jar Library不同的地方是AAR除了java code之外也包含res,也就是一些图片、文字等 资源文件。会设计形式的类别库是因为Google在Android SDK tool r14之后开始支持Library Project的开发方式,这种Library Project可以说是Android APP的半成品,其目标并不是制作成APK来执行,而是提供现成的View/Activiy等一些资源给其他开发者使用。而 AAR正是这种Library Project编译后的压缩包,压缩后只需传递单一文件即可分享,可以说是相当方便。
2.Android项目打包成AAR
将一个Android项目打包成AAR你需要在项目的gradle脚本build.gradle文件中添加 apply plugin: ‘android-library’,然后编译项目,在下图示意的目录下可以找到打包好的arr文件
3.Android项目使用AAR
引用远端的aar
compile 'com.squareup.okhttp3:okhttp:3.6.0'
引用本地aar文件
compile fileTree(dir: 'libs', include: '*.aar')
上传库到Maven仓库
1.首先我们创建一个新的AndroidStudio 项目,然后新建一个module,选择Android Library,类似下面这种结构
Rebuild Project生成依赖的arr包
2.项目的根目录的build.gradle中配置仓库地址
allprojects {
repositories {
jcenter()
maven{
url 'http://localhost:8081/nexus/content/repositories/releases/'
}
}
}
3.配置gradle.properties文件,定义通用属性
#Maven仓库的URL
MAVEN_REPO_RELEASE_URL=http://localhost:8081/nexus/content/repositories/releases/
MAVEN_REPO_SNAPSHOT_URL=http://localhost:8081/nexus/content/repositories/snapshots/ #对应maven的GroupId的值
GROUP = com.xxx
#登录nexus ossde的用户名 NEXUS_USERNAME=admin
#登录nexus oss的密码 NEXUS_PASSWORD=admin123 # groupid
GROUP_ID = com.xxx # type
TYPE = aar # description
DESCRIPTION = app.lib
4.修改module对应的build.gradle文件,添加以下配置
uploadArchives {
configuration = configurations.archives
repositories {
mavenDeployer {
snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
repository(url: MAVEN_REPO_RELEASE_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
pom.project {
version '1.0.0'
artifactId 'app.lib'
groupId GROUP_ID
packaging TYPE
description DESCRIPTION
}
}
}
} artifacts {
archives file('app.lib.aar')
}
5.点击uploadArchives进行编译上传
在as右边栏,找到Gradle打开如下
然后双击uploadArchives,编译脚本并上传arr文件到私有仓库,最后在控制台可以看到日志是否上传成功。
去仓库查看到刚刚上传的库文件
在项目中应用
1.新建一个项目在项目的项目的根目录build.gradle配置如下
maven{
url 'http://localhost:8081/nexus/content/repositories/releases/'
}
2.在app目录下的build.gradle配置如下
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.2.0'
testCompile 'junit:junit:4.12'
compile 'whoislcj:app.lib:1.0.0'
}
这样配置就算结束了,就可以正常的使用了。
总结:
本文学习总结了如何搭建一个私有的maven代码仓库,本文大部分资源来源于这篇博客使用Gradle和Sonatype Nexus 搭建私有maven仓库,重新整理一下有助于我记录整个业务组件化的过程与心得,所以一边看一边搭建一边尝试。
Android业务组件化之Gradle和Sonatype Nexus搭建私有maven仓库的更多相关文章
- Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现
前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...
- Android业务组件化之URL Scheme使用
前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...
- 【转】Android业务组件化之URL Scheme使用
前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...
- Android业务组件化之现状分析与探讨
前言: 从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一 ...
- Android 业务组件化开发实践
组件化并不是新话题,其实很早很早以前我们开始为项目解耦的时候就讨论过的.但那时候我们说的是功能组件化.比如很多公司都常见的,网络请求模块.登录注册模块单独拿出来,交给一个团队开发,而在用的时候只需要接 ...
- Android项目架构之业务组件化
前言: 从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一 ...
- Maven使用笔记(五)Sonatype Nexus 搭建Maven 私服
1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地, 而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载 ...
- 使用Sonatype Nexus搭建Maven私服后,如何添加第三方JAR包
使用Sonatype Nexus搭建Maven私服后如何添加第三方JAR包 步骤如下 1.打开nexus地址,进行登录 2.登录Nexus后,点击右侧的“Repositories”,显示当前Nexus ...
- Android彻底组件化demo发布
今年6月份开始,我开始负责对"得到app"的android代码进行组件化拆分,在动手之前我查阅了很多组件化或者模块化的文章,虽然有一些收获,但是很少有文章能够给出一个整体且有效的方 ...
随机推荐
- TSP问题(旅行商问题)[分支限界法]
问题: 旅行商从 a 开始周游下图所有的城市一次,然后回到 a,城市之间的旅行代价在图中标明. 请选择一个最优的行走顺序使得周游所有城市的代价最小. 思路: 随便怎么周游,对于一个城市来说,一定有一条 ...
- HBuilder开发App教程04-最难搞定的是mui
前言 前几篇说到一些HBuilder开发app的基础教程, 现在来说一下HBuilder开发app的难点,或者说是上手的难点, 就是mui, 如果你没有研究mui就贸然的上手HBuilder,那你的开 ...
- MySQL安装 MySQL5.7.10免安装版配置,mysql5.7.10免安装版
MySQL5.7.10免安装版配置,mysql5.7.10免安装版 最新版的 Mysql 不提供图形界面的安装了, 下载下来是一个压缩包的形式, 那么我们如何来使用它呢, 让它为我们工作呢? 环境: ...
- javascript的页面加载及性能优化(兼容IE7)
通常来说,window.onload就够用了,如果想加载多个事件,我们可以采取以下方式: window.onload = function(){ func1(); func ...
- MySQL只恢复某个库或某张表
在Mysqldump官方工具中,如何只恢复某个库呢? 全库备份 [root@HE1 ~]#mysqldump -uroot -p --single-transaction -A --master-da ...
- js动态控制table的tr,td增加及删除
html: <table id='wifi_clients_table' class="table table-striped table-bordered table-hover ...
- 关于如何正确地在android项目中添加第三方jar包
在android项目中添加第三方jar包虽然不是一个很复杂的问题,但是确实给很多开发者带来了不小的困扰.我自己就曾经碰到过calss not found exception.error inflati ...
- Mangos笔记
$lt.$lte.$gt.$gte和$ne $in.$nin.$or $mod.$not $exists 条件句式内层文档的键,修改器是外层文档的键,一个键可以有多个 条件,但是一个键不能对应多个更新 ...
- aix下java程序运行问题
CLASSPATH=/track.jar:/standalone.jar export CLASSPATH nohup /usr/java6_64/bin/java com.TrackMain > ...
- python bottle 简介
bottle是一个轻量级的python web框架, 可以适配各种web服务器,包括python自带的wsgiref(默认),gevent, cherrypy,gunicorn等等.bottle是单文 ...