【效率提升】maven 转 gradle 实战
一、灵魂三问
1、gradle 是什么?
一个打包工具, 是一个开源构建自动化工具,足够灵活,可以构建几乎任何类型的软件,高性能、可扩展、能洞察等。其中洞察,可以用于分析构建过程中数据,提供分析参考,方便排查问题和不断优化构建性能,以下一次编译分析报告。
2、有什么优势
参考官方文章,针对包含10 子模块的工程,相对 maven 构建速度,大概有 2-3 倍的性能提升,增量编译大概 7 倍的性能提升,参考官方
实测对比:
**** | gradle 耗时 | maven 耗时 |
---|---|---|
全新构建(clean 及下载依赖包) | 1m 35s | 1m58s |
全新构建(clean) | 43s | 60s |
增量构建 | 14s | 43s |
gradle 执行命令: time gradle clean build package -x test
mvn 执行的命令: time mvn clean package -Dmaven.test.skip=true -f $(pwd) -T 1C -Dmaven.artifact.threads=16
综述,经过多轮测试,在增量编译场景优势比较突出平均有 2 倍的性能提升,工程模块越多效率提升越大。
3、迁移是否容易
摸着心口说,并不容易,虽然官方提供了一键迁移的工具,但是还是有一定学习成本,但改造完成确实节省了大把的时间,尤其是改了一两行代码再次编译时。
二、动动手试试
1、安装 gradle
推荐使用 sdkman ,主要用于工具多版本管理的工具,如 java 、gradle 、maven 等可以根据实际情况安装使用其中某个一个版本,如jdk8,jdk11 等,版本间切换非常简便。 sdk 介绍
sdk install gradle 8.1.1
2、执行迁移命令
在当前 maven 工程下,执行如下的命令。
gradle init
Found a Maven build. Generate a Gradle build from this? (default: yes) [yes, no] yes
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2] 1
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] no
不出意外下,会在默认子模块下添加 build.gradle 文件,如下图:
文件解释:
1)buildSrc/main/groovy/com.jd.pegasus.java-conventions.gradle :里面配置的是内网私服库地址。
repositories {
mavenLocal()
maven {
url = uri('http://artifactory.jd.com/libs-releases')
allowInsecureProtocol = true
}
maven {
url = uri('http://artifactory.jd.com/libs-snapshots')
allowInsecureProtocol = true
}
maven {
url "https://plugins.gradle.org/m2/"
}
}
2)gradle.properties :配置环境变量,必须设置 jvm 的参数,否则很容易 oom 。 更多配置
# gradle jvm 设置
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# 开启并行编译
org.gradle.parallel=true
3)build.gradle :包含了编译过程中使用的插件,id 'com.jd.pegasus.java-conventions' 代表自定义的插件。 dependencies 为工程所使用的依赖。
plugins {
id 'com.jd.pegasus.java-conventions'
}
dependencies {
api project(':pegasus-service')
api project(':pegasus-common')
implementation 'org.springframework.boot:spring-boot:2.1.9.RELEASE'
api project(':component-metric')
testImplementation 'org.springframework.boot:spring-boot-starter-test:2.1.9.RELEASE'
annotationProcessor 'org.projectlombok:lombok:1.18.10'
}
description = 'pegasus-worker'
这里面有一个dependencies 依赖项中 api 与 implementation 区别,参见如下解释:
假设你正在维护一个名为 MyLibrary 的库,它依赖于另一个库 InternalLibrary。你希望 MyLibrary 的用户能够使用 InternalLibrary 中的某些类和方法,但不希望他们使用其他类和方法。在这种情况下,你可以在 MyLibrary 的 build.gradle 文件中使用 api 配置来声明对 InternalLibrary 的依赖: dependencies { api project(':InternalLibrary') } 这样,当其他模块依赖于 MyLibrary 时,它们也能够访问 InternalLibrary 中的类和方法。 但是,如果你不希望 MyLibrary 的用户能够访问 InternalLibrary 中的任何内容,你可以在 MyLibrary 的 build.gradle 文件中使用 implementation 配置来声明对 InternalLibrary 的依赖: dependencies { implementation project(':InternalLibrary') } 这样,当其他模块依赖于 MyLibrary 时,它们将无法访问 InternalLibrary 中的任何内容。
简单点就是如果你想把你依赖组件,让使用你组件人也知道的明明白白的也能使用,那你就用 api 把组件传递下去 ,反之就用 implementation ,就自个偷摸使用了,对第三方隐藏了一些内部细节。
3、gitignore 排除不要的目录和文件
# Gradle generated files
build/
.gradle/
/out/
/.gradle/
4、允许以不安全的方式访问私服库
# 在这个文件里面,buildSrc/main/groovy/com.jd.pegasus.java-conventions.gradle
repositories {
mavenLocal()
maven {
url = uri('http://artifactory.jd.com/libs-releases')
allowInsecureProtocol = true
}
}
5、解决 lombok 引发的编译问题
通过 lombok 注解会在编译过程中把注解的类进行扩展,添加 get 、set 、toString 方法等。
# 在编译出错的模块里面 build.gradle 文件中添加注解处理器,annotationProcessor 如下:
dependencies {
api project(':pegasus-service')
annotationProcessor 'org.projectlombok:lombok:1.18.10'
}
6、解决版本依赖冲突
版本冲突指同依赖组件出现不同的版本情况,如pegasus-common 模块依赖的 fastjson 有1.2.83-jdsec.rc1, 1.2.29 and 1.2.12 三个版本,gradle 会自动处理仲裁,规则有以下几点:
1)冲突时会默认采用最新的版本。
2)通过 strictly 标记主要用于降级到指定的版本,如传递依赖引入的版本高,当前版本不兼容,那可以通过这个关键字设置指定的版本。
implementation('com.alibaba:fastjson'){
version{
strictly("1.2.12")
}
}
或者简写为
implementation 'com.alibaba:fastjson:1.2.29!!!'
3)force 的优先级会比较高,会覆盖 strictly 策略
configurations.all {
resolutionStrategy {
// 在这里定义您的依赖解析规则
//force 'com.alibaba:fastjson:1.2.12'
}
}
排查某个模块的依赖冲突
gradle :pegasus-common:dependencyInsight --configuration compileClasspath --dependency com.alibaba:fastjson
7、如何构建 zip 包
以 springboot 为例,参考如下代码即可,在子工程 build.gradle 文件里。
。
plugins {
id 'com.jd.pegasus.java-conventions'
// 引入springboot 插件
id 'org.springframework.boot' version '2.5.6'
}
// 指定 jar 启动的入口函数
bootJar {
manifest {
attributes 'Main-Class': 'com.jd.pegasus.Application'
}
}
// 构建 zip 压缩包,包含启动脚本 bin 目录和 配置文件 conf 目录
task packageZip(type: Zip) {
archiveFileName = "${project.name}-${project.version}.zip"
destinationDirectory = file("${project.buildDir}")
from("${project.projectDir}/src/main/bin") {
into "bin"
}
from("${project.buildDir}/resources/main/conf") {
into "conf"
}
from("${project.buildDir}/libs/${project.name}-${project.version}.jar") {
into "lib"
}
// 表示此任务的运行依赖其它 子任务。
dependsOn bootJar
dependsOn build
}
8、执行构建命令
# -x test 排除单测
gradle clean build package -x test
三、附录参考
后记:
听说 maven 不甘寂寞,由 gradle 和 Takari 的灵感,做了一个守护的 mvnd ,在增量编译场景效率杠杠的,有时间测试对比下。 mvnd 参考
作者:京东科技 宁利广
来源:京东云开发者社区 转载请注明来源
【效率提升】maven 转 gradle 实战的更多相关文章
- Gradle安装 Gradle效率提升 eclipse安装gradle插件 【我】
Gradle安装 从官网下载 gradle4.6版本,也可以从svn地址下载 https://downloads.gradle.org/distributions/gradle-4.6-bin.zip ...
- Gradle实战:发布aar包到maven仓库
查看原文:http://blog.csdn.net/u010818425/article/details/52441711 Gradle实战系列文章: <Gradle基本知识点与常用配置> ...
- Gradle快速上手——从Maven到Gradle
[本文写作于2018年7月5日] 本文适合于有一定Maven应用基础,想快速上手Gradle的读者. 背景 Maven.Gradle都是著名的依赖管理及自动构建工具.提到依赖管理与自动构建,其重要性在 ...
- Maven和Gradle对比
Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天.笔者有幸见证了Maven的没落和Gradl ...
- Gradle实战:不同编译类型的包同设备共存
查看原文:http://blog.csdn.net/u010818425/article/details/52335844 Gradle实战系列文章: <Gradle基本知识点与常用配置> ...
- Maven、gradle、Ant、Eclipse IDE
Maven.gradle.Ant.Eclipse IDE之间的关系 http://wenku.baidu.com/view/d33208810912a21615792910.html?from=sea ...
- Maven和Gradle
Maven和Gradle对比 Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天.笔者有幸见证 ...
- 项目自动构建工具对比(Maven、Gradle、Ant)
Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天. Maven的主要功能主要分为5点,分别是 ...
- 基于微服务的DevOps落地指南 交付效率提升40%
基于微服务的DevOps落地指南 交付效率提升40% 2015-2016年,珍爱线下门店已新增覆盖城市9个,与此同时,CRM系统大小故障却发生了数十起... ... 珍爱网是以“网络征选+人工红娘”模 ...
- Java 中三大构建工具:Ant、Maven和Gradle
Java世界中主要有三大构建工具:Ant.Maven和Gradle 目前:Ant已经销声匿迹.Maven也没落了,而Gradle的发展则如日中天. Maven的主要功能主要分为5点,分别是依赖管理系统 ...
随机推荐
- 【C#/.NET】record介绍
目录 什么是record? 使用record record解构 record原理 结论 什么是record? record是.NET 5中的一种新特性,可以看作是一种概念上不可变的类.recor ...
- 洛谷 P8026 [ONTAK2015] Bajtocja
简要题意 有 \(d\) 张初始为空的无向图,每张中都有 \(n\) 个点,标号从 \(1\) 到 \(n\),\(m\) 次操作,每次往一张图加一条边,并询问有多少有序数对 \((a, b)\) 使 ...
- java调用WebService(未完成)记录篇
背景: 因工作需要和一个Sap相关系统以WebService的方式进行接口联调,之前仅听过这种技术,但并没有实操过,所以将本次开发相关的踩坑进行记录 通过一个实例来认识webservice 服务端 首 ...
- 为什么使用ioutil.ReadAll 函数需要注意
1. 引言 当我们需要将数据一次性加载到内存中,ioutil.ReadAll 函数是一个方便的选择,但是ioutil.ReadAll 的使用是需要注意的. 在这篇文章中,我们将首先对ioutil.Re ...
- 解决安装报错 mysqlclient-1.4.6-cp38-cp38-win32.whl is not a supported wheel on this platform.
解决方法, 重命名 先查看pip对应匹配的名称 在PyCharm中查看 打开下边栏的Terminal,输入 pip debug --verbose 修改为一致后 最后进行安装 进入该安装包目录下,c ...
- vscode中react组件
通过使用这个插件我们可以很方便的进行组件/方法/文件的导入 本篇博客仅对插件进行介绍翻译,便于自己以后使用 常用片段列表 imr: 引入 React import React from 'react' ...
- Java开发大型互联网-架构师必须掌握的分布式技术
Java开发大型互联网-架构师必须掌握的分布式技术 摘要:在当今互联网行业,随着用户量和业务的不断增长,大型互联网系统的设计和开发已经成为了一项头等重要的任务.作为架构师,要能够应对这样的挑战,就必须 ...
- Mysql基础5-用户及权限管理
一.介绍 DCL:Data Control Language(数据控制语言),用来管理数据库用户,控制数据库的访问,权限. 二.用户管理 1.查询用户 语法: 1.use mysql; 2.selec ...
- 【技术积累】Java中的常用类【一】
Math类 Math类是Java中的一个数学工具类,提供了一系列常用的数学方法.下面是Math类的常用方法及其案例: abs() 返回一个数的绝对值. int num = -10; int absNu ...
- 如何新建一个django项目
1.新建项目 2选择django 3.接下来我们进入 djangotest目录输入以下命令,启动服务器: python manage.py runserver 0.0.0.0:8000 0.0.0.0 ...