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

前言:

最近我们老大组织了我们软件团队开了一个小会,说了一些存在的问题,平时在技术上的交流还是比较少的,尤其是在不同的项目之间的开发人员,然而经过这次会议我突然发现,我的缺陷不仅是在基础的能力上,还有一点就是对新的技术,编程思想知之甚少,就用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/repositories
MAVEN_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
# groupid
GROUP_ID = group
# type
TYPE = aar
# description
DESCRIPTION = 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.archives
repositories {
    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所说的,作为一个初级程序员,我的生活就是工作。前段曾为发一个版本搞了个通宵,然而发现最近有些急躁或者疲倦了,当然我也会及时的调整自己,我觉得保持持续的激情就是我们所说的坚持吧。这段老说自己很忙,但是我真的很忙吗?我只是希望忙的时候多注意一些方法,要有效率,要有成果。

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值