Android 业务组件化之 Gradle 和 Sonatype Nexus 搭建私有 maven 仓库

mvqy7955 5年前
   <h3>前言:</h3>    <p>公司的业务组件化推进的已经差不多三四个月的时间了,各个业务组件之间的解耦工作已经基本完成,各个业务组件以module的形式存在项目中,然后项目依赖本地的module,多少有点不太利于项目的并行开发维护了,本质原因就是如果是依赖本地的,必须要将依赖的module和主工程放在一个project里面,这就导致了每个project都需要配置这些依赖关系,如果是公司内多个工程依赖同一个公司内部的业务组件,业务组件有更新时,同步非常麻烦,但公司内部的业务组件不可能部署到公有maven服务器上,所以有必要搭建一个局域网内的maven服务器,方便管理公司内部的公共库及业务组件,通过查阅资料和技术预研确定采用Gradle和Sonatype Nexus搭建私有maven仓库的方式,今天总结一下如何搭建整套集成环境及简单的使用。下图简单示例一下现在的项目结构:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ce84a9fc51afce7714209bc9e0074960.png"></p>    <h2>什么是Maven?</h2>    <p>   Maven是一个项目管理和自动构建工具。Maven 包集中存放的地方,就是 Maven 仓库。这些仓库,可以是放在本地,也可以放在某个远程服务器上。 可以是私有仓库,也可以是公开的。在Android上的使用方式如下</p>    <pre>  <code class="language-groovy">allprojects {      repositories {          mavenCentral();          jcenter()          maven {              url 'file:///Users/my-user-name/Documents/Android/repo/'          }          maven {              url 'http://localhost:8081/nexus/content/repositories/releases/'          }      }  }  </code></pre>    <h3>什么是Gradle?</h3>    <p>Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。</p>    <p>Android支持的Maven仓库:</p>    <ul>     <li>mavenCentral 是最早的 maven 中央仓库</li>     <li>jcenter 是 Android Studio 0.8 版本起的默认 maven 中央仓库</li>     <li>本机的仓库</li>     <li>部署在内网服务器的私有仓库</li>    </ul>    <h3>使用Nexus搭建 maven 私服</h3>    <p>1.下载Nexus</p>    <p>下载地址: <a href="/misc/goto?guid=4959556031052701889" rel="nofollow,noindex">http://www.sonatype.org/nexus/go</a></p>    <p>2.启动Nexus</p>    <p>我这里下载的 <a href="/misc/goto?guid=4959739946591248962" rel="nofollow,noindex"> All platforms - Nexus Repository Manager OSS 2.x -  <strong>bundle.zip</strong> </a> ,下载完成之后,解压后进入\nexus-2.1.2-bundle\nexus-2.1.2\bin\jsw\,根据不同的系统选择不同的文件夹进入,文件夹目录结构如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/da37213bf36087cccfe8fe8f9f5917aa.png"></p>    <p>我这里选择的是windows-x86-64,大致里面有这几个操作项</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/bc9720a5bd4438aa303898ffabb6ec7b.png"></p>    <ul>     <li>console-nexus 启动nexus并开启控制台</li>     <li>install-nexus 将nexus安装成系统服务</li>     <li>start-nexus 开始nexus服务</li>     <li>stop-nexus 停止nexus服务</li>     <li>uninstall-nexus 卸载nexus系统服务</li>    </ul>    <p>双击console-nexus.bat运行。再浏览器中输入 <a href="/misc/goto?guid=4959739946688393734" rel="nofollow,noindex">http://127.0.0.1:8081/nexus/,</a> 如下图所示就代表nexus已经启动成功了。</p>    <p>8081是默认的端口号,要修改端口号,进入\conf\打开nexus.properties文件,修改application-port属性值就可以了。 默认的用户名和密码分别是:admin和admin123。</p>    <p><img src="https://simg.open-open.com/show/dede546d35636b4629322bf2b9a07b9a.png"></p>    <p>3.Nexus仓库</p>    <p>仓库类型:</p>    <ul>     <li>hosted(宿主仓库):用来部署自己,第三方或者公共仓库的构件</li>     <li>proxy(代理仓库):代理远程仓库</li>     <li>virtual(虚拟仓库):默认提供了一个 Central M1虚拟仓库 用来将maven 2适配为maven 1</li>     <li>group(仓库组):统一管理多个仓库</li>    </ul>    <p>Public Repositories: 仓库组</p>    <ul>     <li>3rd party: 无法从公共仓库获得的第三方发布版本的构件仓库</li>     <li>Apache Snapshots: 用了代理ApacheMaven仓库快照版本的构件仓库</li>     <li>Central: 用来代理maven中央仓库中发布版本构件的仓库</li>     <li>Central M1 shadow: 用于提供中央仓库中M1格式的发布版本的构件镜像仓库</li>     <li>Codehaus Snapshots: 用来代理CodehausMaven 仓库的快照版本构件的仓库</li>     <li>Releases: 用来部署管理内部的发布版本构件的宿主类型仓库</li>     <li>Snapshots:用来部署管理内部的快照版本构件的宿主类型仓库</li>    </ul>    <p>4.创建宿主仓库</p>    <p>新建公司的内部仓库,步骤为Repositories –> Add –> Hosted Repository,在页面的下半部分输入框中填入Repository ID和Repository Name即可,比如分别填入zfy 和 zfy repostiory,另外把Deployment Policy设置为Allow Redeploy,点击save就创建完成了。这里我点击添加宿主类型的仓库,在仓库列表的下方会出现新增仓库的配置,如下所示:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/7394e3da6ecfe4c6deffcf11ffa5d672.png"></p>    <p>点击save按钮后就会在仓库列表中看到刚才新增的仓库。</p>    <h3>Android 依赖包 AAR</h3>    <p>1.什么是AAR</p>    <p>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编译后的压缩包,压缩后只需传递单一文件即可分享,可以说是相当方便。</p>    <p>2.Android项目打包成AAR</p>    <p>将一个Android项目打包成AAR你需要在项目的gradle脚本build.gradle文件中添加 apply plugin: ‘android-library’,然后编译项目,在下图示意的目录下可以找到打包好的arr文件</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f44be0755c187a743486251f06619547.png"></p>    <p>3.Android项目使用AAR</p>    <p>引用远端的aar</p>    <pre>  <code class="language-groovy">compile 'com.squareup.okhttp3:okhttp:3.6.0'  </code></pre>    <p>引用本地aar文件</p>    <pre>  <code class="language-groovy">compile fileTree(dir: 'libs', include: '*.aar')  </code></pre>    <h3>上传库到Maven仓库</h3>    <p>1.首先我们创建一个新的AndroidStudio 项目,然后新建一个module,选择Android Library,类似下面这种结构</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/8173667723e03623299c15f584f0f235.png"></p>    <p>Rebuild Project生成依赖的arr包</p>    <p>2.项目的根目录的build.gradle中配置仓库地址</p>    <pre>  <code class="language-groovy">allprojects {      repositories {          jcenter()          maven{              url 'http://localhost:8081/nexus/content/repositories/releases/'          }      }  }  </code></pre>    <p>3.配置gradle.properties文件,定义通用属性</p>    <pre>  <code class="language-groovy">#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  </code></pre>    <p>4.修改module对应的build.gradle文件,添加以下配置</p>    <pre>  <code class="language-groovy">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')  }  </code></pre>    <p>5.点击uploadArchives进行编译上传</p>    <p>在as右边栏,找到Gradle打开如下</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/28a2f306ee441989dea9a089dabe2eff.png"></p>    <p>然后双击uploadArchives,编译脚本并上传arr文件到私有仓库,最后在控制台可以看到日志是否上传成功。</p>    <p>去仓库查看到刚刚上传的库文件</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/bcc7ff9f44587b74d3607823ef2d6753.png"></p>    <h3>在项目中应用</h3>    <p>1.新建一个项目在项目的项目的根目录build.gradle配置如下</p>    <pre>  <code class="language-groovy">maven{        url 'http://localhost:8081/nexus/content/repositories/releases/'      }  </code></pre>    <p>2.在app目录下的build.gradle配置如下</p>    <pre>  <code class="language-groovy">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'  }  </code></pre>    <p>这样配置就算结束了,就可以正常的使用了。</p>    <h3>总结:</h3>    <p>本文学习总结了如何搭建一个私有的maven代码仓库,本文大部分资源来源于这篇博客 使用Gradle和Sonatype Nexus 搭建私有maven仓库 ,重新整理一下有助于我记录整个业务组件化的过程与心得,所以一边看一边搭建一边尝试。</p>    <p> </p>    <p>来自:http://www.cnblogs.com/whoislcj/p/6490120.html</p>    <p> </p>