AndroidStudio使用进阶二:搭建自己的maven私服,并使用Gradle统一依赖管理

来源:互联网 发布:网络小胖眼镜图片 编辑:程序博客网 时间:2024/06/07 04:48

前言:

最近我们老大组织了我们软件团队开了一个小会,说了一些存在的问题,平时在技术上的交流还是比较少的,尤其是在不同的项目之间的开发人员,然而经过这次会议我突然发现,我的缺陷不仅是在基础的能力上,还有一点就是对新的技术,编程思想知之甚少,就用low来形容吧。所以即使再忙也不能把自己陷在敲代码的体力活中,有时候真得跳出来多看看,了解一些主流的技术,使用一些工具,既节约时间,而且可以写出一份优秀的代码。

问题:

  • 将Android项目从Eclipse转到AndroidStudio后,我们所有的依赖,jar,aar包等必须要保持一致,不然就会冲突构建失败。
  • 如果依赖的module太多,构建一个project时每个依赖的module都需要构建,比较费时,然后我也不想去copy已经编译好的aar,因为有时候需要修改依赖的module,需要打开源码,修改后需要上传新版本的aar等等。

方案:

参考了大神们Gradle统一依赖的管理方式,并再次加工,将所有的依赖放到一个config.gradle的配置文件里边。同时写好依赖maven私库和源码的module的配置,这样就可以在源码和aar之间自由切换。

准备工作:使用Nexus Repository搭建maven私服

搭建maven私服很简单,可以参考 Android 项目部署之Nexus私服搭建和应用,公司已经搭好了maven私库,但是毕竟是公共的,不是那么自由,所以我就搭在本地了。下面是主要的一些配置。

Maven的配置文件:D:\xxx\Maven\apache-maven-3.3.9\conf\settings.xml

  <localRepository>E:\***\repository</localRepository> //本地仓库地址,先行创建好文件夹  //nexus服务  <server>         <id>my-nexus-releases</id>         <username>admin</username>         <password>admin123</password>       </server>       <server>         <id>my-nexus-snapshot</id>         <username>admin</username>         <password>admin123</password>       </server>   //镜像 <mirror>             <id>nexus</id>              <url>http://localhost:8081/nexus/content/groups/public/</url>             <mirrorOf>*</mirrorOf>           </mirror>  //nexus仓库配置   <profile>  <id>nexusProfile</id>  <repositories>    <repository>      <id>nexus</id>      <name>Nexus Repository</name>      <url>http://xxx.xx.xx.xx:8081/nexus/content/groups/public/</url>      <layout>default</layout>      <releases>         <enabled>true</enabled>      </releases>      <snapshots>      <enabled>true</enabled>        </snapshots>    </repository>  </repositories></profile>//激活 <activeProfiles>    <activeProfile>nexusProfile</activeProfile>  </activeProfiles>

演示项目:

假设app为主工程,依赖的lib3,lib2,而lib2依赖了lib1。

settings.gradle 配置

include ':lib1'include ':lib2'include ':lib3'include ':app'

maven私库配置,根目录下的build.gradle中的配置

apply from:"config.gradle" //配置统一依赖管理文件buildscript {    repositories {        jcenter()         }    dependencies {        classpath 'com.android.tools.build:gradle:1.3.0'    }}allprojects {    repositories {        jcenter()              maven { url MAVEN_URL }//配置maven私服    }}

全局变量,根目录下的gradle.properties

MAVEN_URL= http://xxx.xx.xx.xx:8081/nexus/content/repositoriesMAVEN_SNAPSHOT_URL = http://xxx.xx.xx.xx:8081/nexus/content/repositories/thirdparty-snapshot/#对应maven的groupId值GROUP=group#登录nexus oss的用户名NEXUS_USERNAME=admin#登录nexus oss的密码NEXUS_PASSWORD=admin123# groupidGROUP_ID = group# typeTYPE = aar# descriptionDESCRIPTION = dependences lib

`

app的build.gradle

dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    compile rootProject.ext.dependencies["lib2"]    compile rootProject.ext.dependencies["lib3"]}

lib2的build.gradle

dependencies {     compile fileTree(dir: 'libs', include: ['*.jar'])     compile rootProject.ext.dependencies["lib1"]}

自动配置上传aar到maven私库的配置

uploadArchives {configuration = configurations.archivesrepositories {    mavenDeployer {        snapshotRepository(url: MAVEN_SNAPSHOT_URL) {            authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)        }        repository(url: MAVEN_URL) {            authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)        }        pom.project {            version rootProject.ext.uploadArchives["lib1"]//版本号            artifactId 'lib1'            groupId GROUP_ID            packaging TYPE            description DESCRIPTION        }    }}}

统一依赖config.gradle

// 依赖全局控制  源码工程和maven私库的aar自由控制,比如现在 lib2依赖lib1的aar 只要注释下方的源码依赖,打开上面的maven依赖即可dependencies = [    "lib1"      : 'group:lib1:1.0.0+',    //"lib2"        : 'group:lib2:1.0.0+',    //"lib3"        : 'group:lib3:1.0.0+',    // "lib1" : project(':lib1'),//lib2(我在后边注明依赖lib1的工程lib2,依赖关系一目了然)    "lib2" : project(':lib2'),//app    "lib3" : project(':lib3'),//app]//上传时修改aar版本号 uploadArchives = [     lib1                 : "1.0.0",     lib1                 : "1.0.0",     lib1                 : "1.0.0" ]

注意:

  • 这么搞有个问题,如果一个lib2依赖的是lib1,那么此时构建生成的aar,会将依赖lib1的aar版本打包一起上传到maven,所以我在版本号后边增加了“+”号,永远保持依赖最新的。

  • 如果lib1打开了源码,那么依赖了lib1的module也要打开源码,逐层上推。

请教:

我将所有的依赖都放到config.gradle中,一是为了方便管理,二是希望能够实现每个module可以在源码和aar之间自由的切换,但是第二点并没有达到最理想的效果,求大神们给出更好的方案。

结语:

这篇博客还是上周写了一大半,中间有些事情耽搁了,一直拖到现在。今晚和一个老同学聊天,我问道她一个问题:站在女生的角度来说,你希望找的男朋友是事业有成的呢?还是愿意找个一无所有的一起创造的呢?她的回答是:其实重点是会照顾人,对女朋友好,当然事业有成最好咯,但往往很少啦,如果不是,至少要是个潜力股,还有,如果真的在乎那个女孩,就算她愿意陪你吃苦,你也是不愿意她为你吃苦的。我觉得说的很真实,所以,还是加油吧。现在办公室就我一个人,打开音响可以放心的把音量调高一点,这样算是给自己一点放松吧。这段一直关注stormzhang的公众号AndroidDeveloper,里边的一篇:我到底有多么拼命,的确和他比确实弱爆了。或许就如stormzhang所说的,作为一个初级程序员,我的生活就是工作。前段曾为发一个版本搞了个通宵,然而发现最近有些急躁或者疲倦了,当然我也会及时的调整自己,我觉得保持持续的激情就是我们所说的坚持吧。这段老说自己很忙,但是我真的很忙吗?我只是希望忙的时候多注意一些方法,要有效率,要有成果。

0 0
原创粉丝点击