一、Gradle相比Maven的优势

  1. 配置简洁

    Maven是用pom.xml管理,引入一个jar包至少5行代码,Gradle只需要一行。

  2. 构建速度快

    Gradle支持daemon方式运行,启动速度快,同时有基于daemon的增量构建,充分利用JVM的运行时优化,和缓存数据构建速度相比Maven快很多。

  3. 更好的灵活性、扩展性

    Gradle 相对于 Maven 等构建工具, 其提供了一系列的 API 让我们有能力去修改或定制项目的构建过程。

二、基本配置

  1. 设置本地仓库地址

    默认本地仓库地址是:~/.gradle,Windows下会占用大量C盘空间。

    设置环境变量,GRADLE_USER_HOME=/your/path

  2. 复用Maven本地仓库

    在repositories配置mavenLocal()即可,如果是init.gradle全局配置,参考以下init.gradle文件

    Maven本地仓库查找路径:

    (1)USER_HOME/.m2/settings.xml

    (2)M2_HOME/conf/settings.xml

    (3)USER_HOME/.m2/repository

  3. 国内镜像加速

    国内访问国外仓库地址很慢,第一种方法是在每个项目中设置repositories

    repositories {
    mavenLocal()
    'maven(http://maven.aliyun.com/nexus/content/groups/public/)'
    mavenCentral()
    }

    更推荐的方式是类似的Maven的settings.xml全局的配置,在上一步配置的GRADLE_USER_HOME路径下,添加init.gradle文件,以下配置文件中使用了阿里云的Gradle代理,支持jcenter、google、maven仓库。

    gradle.projectsLoaded {
    rootProject.allprojects {
    buildscript {
    repositories {
    def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
    def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
    def NEXUS_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
    all { ArtifactRepository repo ->
    if (repo instanceof MavenArtifactRepository) {
    def url = repo.url.toString()
    if (url.startsWith('https://jcenter.bintray.com/')) {
    project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
    println("buildscript ${repo.url} replaced by $JCENTER_URL.")
    remove repo
    }
    else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
    project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
    println("buildscript ${repo.url} replaced by $GOOGLE_URL.")
    remove repo
    }
    else if (url.startsWith('https://repo1.maven.org/maven2')) {
    project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
    println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
    remove repo
    }
    }
    }
    jcenter {
    url JCENTER_URL
    }
    google {
    url GOOGLE_URL
    }
    maven {
    url NEXUS_URL
    }
    }
    }
    repositories {
    def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
    def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
    def NEXUS_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
    all { ArtifactRepository repo ->
    if (repo instanceof MavenArtifactRepository) {
    def url = repo.url.toString()
    if (url.startsWith('https://jcenter.bintray.com/')) {
    project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
    println("buildscript ${repo.url} replaced by $JCENTER_URL.")
    remove repo
    }
    else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
    project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
    println("buildscript ${repo.url} replaced by $GOOGLE_URL.")
    remove repo
    }
    else if (url.startsWith('https://repo1.maven.org/maven2')) {
    project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
    println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
    remove repo
    }
    }
    }
    jcenter {
    url JCENTER_URL
    }
    google {
    url GOOGLE_URL
    }
    maven {
    url NEXUS_URL
    }
    }
    }
    }

三、最佳实践

  1. 多模块配置

    稍微大点的项目都会分模块开发,Gradle相比Maven的一个优势是用IDEA执行一个项目的代码时,会自动编译其依赖的其他模块。

    在项目一级目录下添加settings.gradle配置文件:

    rootProject.name = 'my-roject-name'
    
    include 'module1'
    include 'module2'

    其中module1、module2就是子模块的文件夹名,在子模块里需要有一个配置子模块的build.gradle

    模块内依赖,比如module2依赖module1,在module2的build.gradle配置文件里添加:

    dependencies {
    compile project(":module1")
    }
  2. profile支持

    profile用来加载不同环境的的配置文件,在笔者所在公司,推荐dev、test、staging、prod四套环境。

    添加gradle.properties配置文件指定默认profile

    profile=dev

    启动profile,加载不同路径下的配置,在build.gradle里添加配置:

    ext {
    profile = project['profile']
    }
    sourceSets {
    main {
    resources {
    srcDirs = ["src/main/resources/", "src/main/profiles/${profile}"]
    }
    }
    }

    命令行参数指定profile:

    gradle build -Pprofile=prod
  3. 初始化gradle项目

    安装gradle,并在项目顶级目录下执行:

    gradle init

    如果当前目录有pom.xml,接下来会提示是否从Maven项目初始化Gradle项目,选择yes回车执行。

    参数文档:https://docs.gradle.org/current/userguide/build_init_plugin.html

  4. 引入bom文件

    pom文件在Maven中是一个很有用的功能,方便多个项目统一版本号,在Maven中配置方式如下:

    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>${spring-boot.version}</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    Gradle有插件支持类似操作:

    //引入插件
    plugins {
    id "io.spring.dependency-management" version "1.0.10.RELEASE"
    }
    //引入bom
    dependencyManagement {
    imports {
    mavenBom 'org.springframework.boot:spring-boot-dependencies:${spring-boot.version}'
    }
    }
    //使用bom,不需要执行版本号
    dependencies {
    implementation "org.springframework.boot:spring-boot-starter-web"
    }
  5. 引入parent文件

    在maven中执行parent是管理多个项目常用的方式,parent指定了项目的基本配置,配置方式如下:

    <parent>
    <groupId>com.lesofn.blog</groupId>
    <artifactId>test-parent</artifactId>
    <version>0.0.1</version>
    </parent>

    Maven中的parent有两个作用,一个是类似bom的统一管理版本,即parent中的:dependencyManagement,另一个是基础jar包的引用,即父pom中的:dependencies

    在Gradle可通过上面的io.spring.dependency-management插件实现类似的效果:

    //引入插件
    plugins {
    id "io.spring.dependency-management" version "1.0.10.RELEASE"
    }
    //引入parent,实现maven中dependencyManagement的功能,不用指定版本号
    dependencyManagement {
    imports {
    mavenBom 'com.lesofn.blog:test-parent:0.0.1'
    }
    }
    //再次引入parent,实现maven中dependencies的功能
    dependencies {
    implementation 'com.lesofn.blog:test-parent:0.0.1'
    }

四、总结

经过以上配置,基本覆盖了Gradle开发过程中的大部分问题,如果还有什么问题,欢迎留言讨论。

本文作者:木小丰,美团Java高级工程师,关注架构、软件工程、全栈等,不定期分享软件研发过程中的实践、思考。

博客地址:https://lesofn.com/archives/gradle-zui-jia-shi-jian

公共号:Java研发

Gradle最佳实践的更多相关文章

  1. build.gradle最佳实践之buildConfigField

    使用AndroidStudio进行开发,其中很重要的一个文件就是build.gradle,他是整个项目的控制中心,这里收集一些日常会用到的语法或者使用技巧,以备后用.这篇博客主要说明 buildTyp ...

  2. Gradle配置最佳实践

    https://blog.csdn.net/devilnov/article/details/53321164 本文会不定期更新,推荐watch下项目.如果喜欢请star,如果觉得有纰漏请提交issu ...

  3. Spring Batch在大型企业中的最佳实践

    在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...

  4. Google Developing for Android 二 - Memory 最佳实践 // lightSky‘Blog

    Google Developing for Android 二 - Memory 最佳实践   |   分类于 Android最佳实践 原文:Developing for Android, II Th ...

  5. [转]Android开发最佳实践

    ——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢—— 原文链接:https://github.com/futurice/and ...

  6. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  7. 听说你还不会用Dagger2?Dagger2 For Android最佳实践教程

    前言 Dagger2是现在非常火的一个依赖注入框架,目前由Google维护,在Github上面已经有12K star了.Dagger2的入门门槛其实是比较高的,据了解,目前有很多Android工程师对 ...

  8. Android学习之基础知识七—碎片的最佳实践

    一.Android碎片(Fragment)的最佳实践——简易版新闻应用 第一步:新建FragmentBestPractice项目,在app/build.gradle当中添加:RecyclerView ...

  9. Android开发最佳实践

    Android开发最佳实践 摘要 ●使用 Gradle 和它推荐的工程结构 ●把密码和敏感数据放在gradle.properties ●不要自己写 HTTP 客户端,使用Volley或OkHttp库 ...

随机推荐

  1. tensorflow GPU的使用

    参考:https://blog.csdn.net/mzpmzk/article/details/78647711 import os # 默认情况,TF 会占用所有 GPU 的所有内存, 我们可以指定 ...

  2. 蒲公英 · JELLY技术周刊 Vol.33: 前端基础课堂开课啦~

    蒲公英 · JELLY技术周刊 Vol.33 页面文件太大?图片过大了吧:页面加载白屏?很有可能是字体文件还没加载完:页面加载时间过长?多半是主进程被阻塞--该怎么办呢?快来小葵,咳咳,「蒲公英」前端 ...

  3. javascript常用继承方式.

      //原型链继承 function Parent() { this.name = 'per'; } function Child() { this.age = 20; } Child.prototy ...

  4. Linux 批量创建user和批量删除用户

    Linux 批量创建user和批量删除用户 以下为批量创建用户: #首先我们需要创建一个xxx.txt文件,把需要的我们创建的用户写在这个文本里面来,注意:每写完一个用户都需要换行. vim user ...

  5. Spring AOP的理解(通俗易懂)。

    转载 原文链接:http://www.verydemo.com/demo_c143_i20837.html 这种在运行时,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. 1. ...

  6. 使用MySQL Shell创建MGR

    本篇知识点: 配置MGR所需的参数 使用MySQL Shell配置MGR shell.connect() var 设定临时变量 dba.createCluster() dba.getCluster() ...

  7. Qingcloud_MySQL Plus(Xenon) 高可用搭建实验

    实验:Xenon on 5.7.30 Xenon (MySQL Plus) 是青云Qingcloud的一个开源项目,号称金融级别强一致性的高可用解决方案,项目地址为 https://github.co ...

  8. WindowsPhone8.1 开发-- 二维码扫描

    随着 WinRT 8.1 API 的发布,Windows 8.1 和 Windows Phone 8.1 (基于 WinRT) 应用程序的开发模型经历了戏剧性的收敛性.与一些特定于平台的考虑,我们现在 ...

  9. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  10. 配置OSPF与BFD联动

    组网图形 OSPF与BFD联动简介 双向转发检测BFD(Bidirectional Forwarding Detection)是一种用于检测转发引擎之间通信故障的检测机制.BFD对两个系统间的.同一路 ...