前言:

公司的业务组件化推进的已经差不多三四个月的时间了,各个业务组件之间的解耦工作已经基本完成,各个业务组件以module的形式存在项目中,然后项目依赖本地的module,多少有点不太利于项目的并行开发维护了,本质原因就是如果是依赖本地的,必须要将依赖的module和主工程放在一个project里面,这就导致了每个project都需要配置这些依赖关系,如果是公司内多个工程依赖同一个公司内部的业务组件,业务组件有更新时,同步非常麻烦,但公司内部的业务组件不可能部署到公有maven服务器上,所以有必要搭建一个局域网内的maven服务器,方便管理公司内部的公共库及业务组件,通过查阅资料和技术预研确定采用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仓库的更多相关文章

  1. Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现

    前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...

  2. Android业务组件化之URL Scheme使用

    前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...

  3. 【转】Android业务组件化之URL Scheme使用

    前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...

  4. Android业务组件化之现状分析与探讨

    前言: 从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一 ...

  5. Android 业务组件化开发实践

    组件化并不是新话题,其实很早很早以前我们开始为项目解耦的时候就讨论过的.但那时候我们说的是功能组件化.比如很多公司都常见的,网络请求模块.登录注册模块单独拿出来,交给一个团队开发,而在用的时候只需要接 ...

  6. Android项目架构之业务组件化

    前言: 从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一 ...

  7. Maven使用笔记(五)Sonatype Nexus 搭建Maven 私服

    1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地, 而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载 ...

  8. 使用Sonatype Nexus搭建Maven私服后,如何添加第三方JAR包

    使用Sonatype Nexus搭建Maven私服后如何添加第三方JAR包 步骤如下 1.打开nexus地址,进行登录 2.登录Nexus后,点击右侧的“Repositories”,显示当前Nexus ...

  9. Android彻底组件化demo发布

    今年6月份开始,我开始负责对"得到app"的android代码进行组件化拆分,在动手之前我查阅了很多组件化或者模块化的文章,虽然有一些收获,但是很少有文章能够给出一个整体且有效的方 ...

随机推荐

  1. Antx简介(ali_PPT)

    Antx的由来: §最早,我们用Makefile来build系统 •Makefile不适合Java的编译 §后来,我们用Ant来build系统 •开始时很不错 •随着项目增多,出现困难 §利用bean ...

  2. zepto.js swipe实现触屏tab菜单

    今天我们来说下zepto.js,有兴趣的朋友可以先进这个网站“http://zeptojs.com/” ,这个可以说是手机里的jquery,但是它取消了hover,加上了swipe及tap这两个触屏功 ...

  3. JavaScript对象属性的基础教程指南

    JavaScript是使用“对象化编程”的,或者叫“面向对象编程”的.所谓“对象化编程”,意思是把JavaScript能涉及的范围划分成大大小小的对象,对象下面还继续划分对象直至非常详细为止,所有的编 ...

  4. 在JS中使用COM组件的方法

    首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法: STDMETHODIMP Ctest::test(void) //无输入输出参数 { // TODO: 在此添加实现代码 ...

  5. 对angularjs时间过滤格式

    在最近的项目中,我遇到这样的一个小问题,从后台传过来一个时间值,格式如下: "/Date(1484743002000)/" 至于为什么是这种格式,后台的开发说数据库中就是这个存的( ...

  6. yum网络源配置

    [root@xuegod60 ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak[root@x ...

  7. .net判断System.Data.DataRow中是否包含某列

    大家对将DataRow转成实体对象并不陌生,转成实体的时候一般都会加上这个判断  if (row["字段名"] != null && row["字段名&q ...

  8. 同步、异步、阻塞、非阻塞IO

    在网上看到一篇对这四个概念比较清晰的分析的文章:http://blog.csdn.net/historyasamirror/article/details/5778378.结合自己一直在学习Java ...

  9. Javaweb程序服务器部署

    话说从接触web后就想着写一个自己的站点然后别人都可以访问,这也是一个小目标吧,从之前在使用校园网的时候把自己的电脑当成服务器然后部署使用同学的电脑访问,现在想让所有人都可以访问,于是就花重金租了腾讯 ...

  10. 《JAVASCRIPT高级程序设计》第三章

    <JAVASCRIPT高级程序设计>第三章主要讲述了这门语言的基础概念,内容多而浅,通过思维导图可以帮助我们很好的理清脉络. js函数使用function关键字来声明,以下是一个简单的例子 ...