Invalid Gradle JDK configuration found_带你了解Gradle编译速度是如何提升70%的

前言

Gradle作为一款基于Groovy语言的构建工具,已经吸引众多的ant,maven使用者转投gradle的怀抱,和Gradle相比,ant显得冗余复杂,maven显得有些死板落后,而gradle基于DSL语法,特点明显:简洁、灵活、可读性强。

背景

♦ Maven 的软件代码由 Apache 基金会维护。而基础设施主要由 Sonatype、JFrog 两家企业维护,他们分别提供 Nexus 和 Artifactory 两大 artifact 管理体系,维护 Central 与 JCenter 两大公共仓库,并提供收费的企业服务(咨询、培训、认证、定制开发、云服务、高级管理工具)。

♦ Gradle 则是由 Gradle Inc. 维护,该企业也提供收费的 Gradle Enterprise 解决方案。

首先要说的是我们用的 Gradle 来作为我们的构建工具,所以主要是针对 Gradle 的命令来作了一些优化。

1、修改 gradle build 的参数

  • 使用 --build-cache

什么是 build cache(构建缓存),在 Gradle 中,每一个待编译的工程叫 Project,每一个 Project 在构建时都包含一系列的 task。

a7a70663a303fec4758d2d61f9c756d4.png

每个 task 的输入都可以作为下一个 task 的输出,build cache 做的事就是把可以缓存(注:并不是所有的 task 输出都能缓存)的 task 输出都缓存住,这样在构建过程中,如果发现这个 task 的输入不变,就没必要重新执行任务了,直接从 task ouput 缓存里拿即可,如下图示,Build 2 的构建输入直接从 Build Cache 中拿,这样 Build 1 就不用构建了。

3f39271a19932f060c37cd27b3013604.png

效果怎么样呢,看下图,下面图分别显示了 Gradle 持续集成时使用构建缓存和不使用构建缓存两种情况下的聚合的构建时间,可以看到使用了 cache 的 Gradle 构建速度明显快于不使用 cache 的情况。

00df4e3782eb272ce4e5191b925dce6e.png

更骚的是这个 Buiid Cache 支持分布式的,可以统一把这些 cache 丢到一台机器上,本地机器要编译时统一去这台机器拉 cache,这样如果我们切换分支时执行构建也能用 Build Cache 来加快构建速度。

--build-cache 的具有使用需要注意一些事项,比如得 Gradle 4.3 以上才有效,建议大家直接去官网查查看。

  • 增加 --parallel 参数

并行执行在多项目编译的项目中能有效提升编译的速度,但是并行执行的前提是每个项目已经被模块化,每个项目之间没有耦合。

  • 移除 --refresh-dependencies 参数

原来 gradle build 有加这个参数,这个参数会忽略缓存,强制重新下载,显然是编译的瓶颈。

2、任务并行

原来 Jenkins 中执行 Gradle 编译任务,每个 Task 是串行执行的,总编译耗时是每个任务执行时间的总和。

7725242855efdd8f28acf705f1cd161d.png

现在把它改成了并行的

8c065085ae4fe19553d9ef67d9087fa0.png

显然并行执行会快得多。

3、将大项目工程中的常用代码抽成 jar 包

对于业务方来说,采用这种方式也是提升编译速度的有效手段 ,将大量代码抽成 jar 包,意味着它们本身就是字节码了,在 gradle build 时就不用编译啦。自然能提升整个工程的编译打包时间。

总结

如果你 Gradle 用得越多,越能体会到这种理念上的差异。

  • Maven 作为一个依赖管理工具而诞生,对于它上层的商业形态而言,这个工具只是基础之一,这不影响它的工具属性;
  • Gradle 作为一个构建工具而诞生,它的商业形态围绕着这个核心而展开,这影响它的工具属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【游戏开发】C 游戏编程实例

网络游戏开发分为:服务器编程、客户端编程、人工智能、数据库管理、游戏策划、美工设计、音乐特效等。大型游戏往往需要团队合作开发,因此面向对象的编程思想在网络游戏中得到了广泛应用。游戏开发基本流程:游戏初始化——游戏实现——游戏结…

linux内核3.14.4,Linux内核4.14.14,4.9.77,4.4.112和3.18.92更新发布

原标题:Linux内核4.14.14,4.9.77,4.4.112和3.18.92更新发布导读正如所承诺的,Linux内核维护者Greg Kroah-Hartman今天发布了针对长期支持的Linux 4.14,4.9,4.4和3.18内核系列的一系列新更新。这些新内核在他们之前发布的一个星期后…

springboot 获取登录浏览器_java项目部署到linux服务器,微信小程序后台springboot项目部署到云服务器(图文详解)...

前面给大家讲了一个点餐系统的开发,包括java点餐后台和微信点餐小程序。可是都是教大家如何在本地把项目跑起来。今天就来教大家如何把这个点餐系统部署到服务器,实现商用。传送门点餐系统的开发,java后台微信小程序:https://blog…

spring体系结构_了解Spring Web应用程序体系结构:经典方法

spring体系结构每个开发人员必须了解两件事: 架构设计是必要的。 花哨的体系结构图没有描述应用程序的真实体系结构。 真正的体系结构是从开发人员编写的代码中找到的,如果不设计应用程序的体系结构,最终将得到一个具有多个体系结构的应用…

C 网络库都干了什么?

虽然市面上已经有很多成熟的网络库,但是编写一个自己的网络库依然让我获益匪浅,这篇文章主要包含:TCP 网络库都干了些什么?编写时需要注意哪些问题?CppNet 是如何解决的。首先,大家都知道操作系统原生的soc…

iphone屏幕录制_iPhone怎么内录声音?怎么录制苹果手机内部声音?

有时我们想要对苹果手机上播放的声音进行录音,却不知道该如何操作。苹果手机上自带的录音软件只可以对手机外部声音进行录制,却无法录制自身播放的声音。其实我们可以先将苹果手机屏幕及声音先投放到电脑上,再通过支持内录的软件进行录音就可…

C 中命名空间的五大常见用法

译者注:可能很多程序员对C 已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。命名空间在1995年被引入到 c 标准中,通常是这样定义的:命名空间定义了新的作用域。它们提供了一…

英伟达TX2烧录系统_英伟达的DPU,是想在数据中心奇袭英特尔?

热点追踪 / 深度探讨 / 实地探访 / 商务合作最近几年,经常关注科技圈的朋友们总会发现,每次遇到厂商有重大发布,就总能看到“颠覆”、“极致”、“革命性”等概念出现在发布会上。上周,iPhone12的发布现场,蒂姆库克就用…

C vector详解

【导读】:vector是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,vector是一个能够存放任意类型的动态数组。接下来,请跟随小…

arcgis 出图背景_ArcGIS空间制图分析视频教程(二狮兄出品)含ArcMap

这套教程是二狮兄出的一套ArcGIS地理空间制图数据分析视频教程,含ArcMap/ArcCatalog部分。教程分为上中下三部,已全部录制完毕,全部课程120节。适用人群ArcGIS目前的应用范围非常广泛,包括但不限于从事地理景观、生态环境、规划设…

C 之父:C 的成功属于意料之外,C 11是转折点

C 的起源可以追溯到 40 年前,但它仍然是当今使用最广泛的编程语言之一。到 2020 年 9 月为止,C 是仅次于 C 语言、Java 和 Python,位于全球第四的编程语言。根据最新的 TIOBE 索引,C 也是增长最快的语言。近日,C 之父 …

aix磁盘挂载到linux,AIX下文件系统挂载点相互调换方案

由于业务发展的需要,企业在异地实现了数据块级的灾备,由于原来的备份目录lv所在VG恰好在远程灾备VG内(该方案实现的是vg级别的数据同步),为了节省带宽所以又从存储上新划分出一块磁盘新建了一个vg作为备份空间使用。但是由于当时厂商在创建vg…

苹果几最好用_深度解析安卓手机和苹果手机到底有哪些区别,哪种手机最好用...

"安卓阵营手机和苹果手机一直是手机界多年的竞争对手。由于安卓系统是开源的系统,任何厂家都能使用它。而导致安卓系统全球碎片化的主要原因是大部分国产品牌手机都没有安装谷歌服务,对于外国人的来说安装了谷歌服务的安卓手机才是完整的。然而中国…

linux设置基础软件仓库时,安装centos系统时设置基础软件仓库出错

安装centos系统时设置基础软件仓库出错,公钥,命令,视频教程,器上,提示安装centos系统时设置基础软件仓库出错易采站长站,站长之家为您整理了安装centos系统时设置基础软件仓库出错的相关内容。1、首先登录CentOS服务器,连接上服务器之后我们使用yum remo…

C 11实现的100行线程池

【导读】:C 线程池一直都是各位程序员们造轮子的首选项目之一。今天,小编带大家一起来看看这个轻量的线程池,本线程池是header-only的,并且整个文件只有100行,其中C 的高级用法有很多,很值得我们学习&#…

tensorflow2 目标检测_基于光流的视频目标检测系列文章解读

作者:平凡的外卖小哥全文5747字,预计阅读时间15分钟1 简介目前针对于图片的目标检测的方法大致分为两类:faster R-CNN/R-FCN一类:此类方法在进行bbox回归和分类之前,必须通过region proposal network(RPN)得到RoI&…

sts集成jboss_如何为JBoss Developer Studio 8设置集成和SOA工具

sts集成jboss最新的JBoss Developer Studio(JBDS)的发布带来了有关如何开始使用尚未安装的各种JBoss Integration和BPM产品工具集的问题。 在本系列文章中,我们将为您概述如何安装每套工具并说明它们支持哪些产品。 这将有助于您在着手进行…

C 多线程的互斥锁应用RAII机制

什么是RAII机制RAII是Resource Acquisition Is Initialization(翻译成 “资源获取即初始化”)的简称,是C 语言的一种管理资源、避免资源泄漏的惯用法,该方法依赖构造函数资和析构函数的执行机制。RAII的做法是使用一个类对象&…

c iostream.源码_通达信《K线上画趋势线预警》精选指标(附源码)

通达信《K线上画趋势线预警》精选指标K线上画趋势线预警源码:N:5;MA5:EMA(C,5)COLORWHITE;MA13:EMA(C,13)COLORCYAN;MA21:EMA(C,21)COLORMAGENTA;MA34:EMA(C,34)COLORYELLOW;MA55:EMA(C,55)COLORRED;{画线}A1:REF(H,N)HHV(H,2*N1);B1:FILTER(A1,N);C1:BACKSET(B1,N1…

linux module原理,NodeJS的模块原理

最近一直在使用Node JS,在网上看到了一段代码我觉得完美的诠释了Node JS模块加载的原理,其实深究下去,它还诠释了许多东西:Js模块化编程、闭包的真正强大之处等等。闲话不说,先看看这段代码:// - hello.jsv…