公司的业务组件化推进的已经差不多三四个月的时间了,各个业务组件之间的解耦工作已经基本完成,各个业务组件以module的形式存在项目中,然后项目依赖本地的module,多少有点不太利于项目的并行开发维护了,本质原因就是如果是依赖本地的,必须要将依赖的module和主工程放在一个project里面,这就导致了每个project都需要配置这些依赖关系,如果是公司内多个工程依赖同一个公司内部的业务组件,业务组件有更新时,同步非常麻烦,但公司内部的业务组件不可能部署到公有maven服务器上,所以有必要搭建一个局域网内的maven服务器,方便管理公司内部的公共库及业务组件,通过查阅资料和技术预研确定采用Gradle和Sonatype Nexus搭建私有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是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。
Android支持的Maven仓库:
下载地址:http://www.sonatype.org/nexus/go
我这里下载的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.bat运行。再浏览器中输入http://127.0.0.1:8081/nexus/,如下图所示就代表nexus已经启动成功了。
8081是默认的端口号,要修改端口号,进入\conf\打开nexus.properties文件,修改application-port属性值就可以了。 默认的用户名和密码分别是:admin和admin123。
仓库类型:
Public Repositories: 仓库组
新建公司的内部仓库,步骤为Repositories –> Add –> Hosted Repository,在页面的下半部分输入框中填入Repository ID和Repository Name即可,比如分别填入zfy 和 zfy repostiory,另外把Deployment Policy设置为Allow Redeploy,点击save就创建完成了。这里我点击添加宿主类型的仓库,在仓库列表的下方会出现新增仓库的配置,如下所示:
点击save按钮后就会在仓库列表中看到刚才新增的仓库。
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编译后的压缩包,压缩后只需传递单一文件即可分享,可以说是相当方便。
将一个Android项目打包成AAR你需要在项目的gradle脚本build.gradle文件中添加 apply plugin: ‘android-library’,然后编译项目,在下图示意的目录下可以找到打包好的arr文件
引用远端的aar
compile 'com.squareup.okhttp3:okhttp:3.6.0'
引用本地aar文件
compile fileTree(dir: 'libs', include: '*.aar')
Rebuild Project生成依赖的arr包
allprojects {
repositories {
jcenter()
maven{
url 'http://localhost:8081/nexus/content/repositories/releases/'
}
}
}
#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
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')
}
在as右边栏,找到Gradle打开如下
然后双击uploadArchives,编译脚本并上传arr文件到私有仓库,最后在控制台可以看到日志是否上传成功。
去仓库查看到刚刚上传的库文件
maven{
url 'http://localhost:8081/nexus/content/repositories/releases/'
}
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仓库,重新整理一下有助于我记录整个业务组件化的过程与心得,所以一边看一边搭建一边尝试。