Android Gradle 本地化部署 maven

1、Gradle 脚本

        在 Android Studio 中,我们经常引用 aar 文件及 maven 库中的资源。一般来说,我们通过 compile 'package:library_name:version' 的方式来引用 maven 库中的包。而通过 compile(name: 'xxx', ext: 'aar') 的方法引用本地生成或其他项目生成的 aar 包(详细请见)。

2、Gradle 引用方式

        上面说的本地直接引用 aar 文件的方式有一些问题,比如:

  • 资源文件预览等等会有一些 Bug;
  • 新生成 aar 后,在多个项目之间共享时,频繁的拷贝同步会很麻烦。

        所以我们尝试在本地部署我们的项目,然后在其他项目中直接可以引用了。首先,我们知道,在 Build 脚本运行 compile package:library_name:version 时,会去下面一些目录寻找:

        如果你额外在 build.gradle 中自定义配置了本地目录的话,还会去这个目录下面查找,比如在 build.gradle 中配置了:

        
《Android Gradle 本地化部署 maven》 额外查找目录

    那么查询的目录会多加四个:

  • file:/PROJECT_PATH/commonlibs/library_name.jar
  • file:/PROJECT_PATH/commonlibs/library_name-version.jar
  • file:/PROJECT_PATH/MODULE_NAME/libs/library_name.jar
  • file:/PROJECT_PATH/MODULE_NAME/libs/library_name-version.jar

当在这些目录都找不到依赖后,会运行出错,组建失败。

《Android Gradle 本地化部署 maven》 找不到库出错

3、本地部署 aar

        在知道了 Gradle 的引用查找原则之后,我们就可以将自己的项目按需部署到本地了。我们一般配置在 ANDROID_HOME/extras/android/m2repository 这个目录中,这样,其他所有工程都可以很方便的访问到,同步更新也只更新一个地方即可。

        首先,我们在系统环境变量中设置 ANDROID_HOME——指向 Android SDK 的安装目录,确保本地部署时能找到相应的目录。

        然后,为所需部署的 Module 编写 build.gradle 脚本如下:

        
《Android Gradle 本地化部署 maven》 部署 Gradle 脚本编写

        我们可以看出,有如下步骤:

  • apply plugin: 'maven':引用 maven 插件进行部署;
  • 增加 uploadArchives Task,用于部署 Module;
  • mavenDeployer 中编写相应的配置,包括部署路径、version、groupId、artifactId 等等;

        我们可以看到,我们将部署目标路径设为:file://localhost/ANDROID_HOME/extras/android/m2repository/,这样部署后,相应的 aar、pos、jar 等等文件都会在这个目录中找到。

4、执行部署

        执行部署非常简单,我们可以在命令行执行 gradle uploadArchives 这个任务。或者另一种办法是在 Gradle Projects 窗口找到这个 Module 对应的部署 Task,双击执行这个 Task 即可:

        
《Android Gradle 本地化部署 maven》 部署 Task

        在执行完成后,我们在相应的目标目录可以找到部署的文件:

        
《Android Gradle 本地化部署 maven》 部署结果

        部署完成后,我们在其他工程中,直接 compile 'package:library_name:version'就可以引用了。Gradle 会自动查找到这个依赖以及相应的库文件,引入到工程中进行组建。

5、多 Module 部署

        在比较大的项目中,我们经常会在一个 Project 中拥有多个 Module,而这些 Module 中又有相互引用的情况。比如:

        
《Android Gradle 本地化部署 maven》 多 Module 示例

        比如这个例子中,project 下有两个 Module,而 ModuleB 又在项目内引用了 ModuleA,这时候,在部署 ModuleB 的时候,为 ModuleB 生成的 pom 文件会有问题:

        [站外图片上传中…(image-49af3f-1509673794164)]

        我们可以看出,ModuleB 的 pom 中声明引用了 ModuleA,但是 Module A 对应的 groupIdversion 都不对,这样,在第三方引用 ModuleB 的时候,会出现依赖错误。这个时候,解决办法是在 ModuleA 的 build.gradle 中加入 project.groupproject.version ,这样在生成 ModuleB 的 pom 的时候,会自动填入这两个值。

        ModuleA 的 build.gradle 如下:

        
《Android Gradle 本地化部署 maven》 project.group 和 project.version

        如果填写了 project.groupproject.version 后,就没必要在 mavenDeployer 中填写 pom.groupIdpom.version 了,Gradle 会自动使用 project.groupproject.version 填入。这样,为 ModuleA 和 ModuleB 部署,都不会出现问题了。

6、参考

    原文作者:牧秦丶
    原文地址: https://www.jianshu.com/p/6b7e8b7561e1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞