一、灵魂三问

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

三、附录参考

1.一文搞懂Gradle的依赖管理和版本决议

  1. gradle 与 maven 性能对比

  2. 爬坑指南 -- 理解 Plugin、Task、构建流程

  3. 如何定位和解决依赖冲突

  4. Gradle依赖之‘五种依赖配置’

  5. Migrating Builds From Apache Maven

后记:

听说 maven 不甘寂寞,由 gradle 和 Takari 的灵感,做了一个守护的 mvnd ,在增量编译场景效率杠杠的,有时间测试对比下。 mvnd 参考

作者:京东科技 宁利广

来源:京东云开发者社区 转载请注明来源

【效率提升】maven 转 gradle 实战的更多相关文章

  1. Gradle安装 Gradle效率提升 eclipse安装gradle插件 【我】

    Gradle安装 从官网下载 gradle4.6版本,也可以从svn地址下载 https://downloads.gradle.org/distributions/gradle-4.6-bin.zip ...

  2. Gradle实战:发布aar包到maven仓库

    查看原文:http://blog.csdn.net/u010818425/article/details/52441711 Gradle实战系列文章: <Gradle基本知识点与常用配置> ...

  3. Gradle快速上手——从Maven到Gradle

    [本文写作于2018年7月5日] 本文适合于有一定Maven应用基础,想快速上手Gradle的读者. 背景 Maven.Gradle都是著名的依赖管理及自动构建工具.提到依赖管理与自动构建,其重要性在 ...

  4. Maven和Gradle对比

    Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天.笔者有幸见证了Maven的没落和Gradl ...

  5. Gradle实战:不同编译类型的包同设备共存

    查看原文:http://blog.csdn.net/u010818425/article/details/52335844 Gradle实战系列文章: <Gradle基本知识点与常用配置> ...

  6. Maven、gradle、Ant、Eclipse IDE

    Maven.gradle.Ant.Eclipse IDE之间的关系 http://wenku.baidu.com/view/d33208810912a21615792910.html?from=sea ...

  7. Maven和Gradle

    Maven和Gradle对比 Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天.笔者有幸见证 ...

  8. 项目自动构建工具对比(Maven、Gradle、Ant)

    Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天. Maven的主要功能主要分为5点,分别是 ...

  9. 基于微服务的DevOps落地指南 交付效率提升40%

    基于微服务的DevOps落地指南 交付效率提升40% 2015-2016年,珍爱线下门店已新增覆盖城市9个,与此同时,CRM系统大小故障却发生了数十起... ... 珍爱网是以“网络征选+人工红娘”模 ...

  10. Java 中三大构建工具:Ant、Maven和Gradle

    Java世界中主要有三大构建工具:Ant.Maven和Gradle 目前:Ant已经销声匿迹.Maven也没落了,而Gradle的发展则如日中天. Maven的主要功能主要分为5点,分别是依赖管理系统 ...

随机推荐

  1. 2023-06-07:Redis 持久化方式有哪些?以及有什么区别?

    2023-06-07:Redis 持久化方式有哪些?以及有什么区别? 答案2023-06-07: Redis提供了两种持久化机制:RDB和AOF. RDB RDB持久化是将Redis当前进程中的数据生 ...

  2. 云原生时代Go最受欢迎Web开源框架Gin原理与实战

    @ 目录 概述 定义 特点 概览导图 使用 快速入门 HTTP 方法使用 参数获取 参数绑定 自定义日志输出 自定义中间件 路由组 HTML渲染 设置和获取Cookie XML.YAML.ProtoB ...

  3. SpringBoot定义优雅全局统一Restful API 响应框架六

    闲话不多说,继续优化 全局统一Restful API 响应框架 做到项目通用 接口可扩展. 如果没有看前面几篇文章请先看前面几篇 SpringBoot定义优雅全局统一Restful API 响应框架 ...

  4. CKS 考试题整理 (05)-Container 安全上下文

    Context Container Security Context 应在特定 namespace 中修改 Deployment. Task 按照如下要求修改 sec-ns 命名空间里的 Deploy ...

  5. 无法将“Ethernet0”连接到虚拟网络“VMnet8”。

    出现这个问题的解决办法,请参考右侧链接:https://blog.csdn.net/big_bigwolf/article/details/79147388

  6. 使@schedule支持多线程的配置类

    package com.longshine.goverquartz.core.config;import org.springframework.boot.autoconfigure.batch.Ba ...

  7. 解决Springboot项目打成jar包后获取resources目录下的文件失败的问题

    前几天在项目读取resources目录下的文件时碰到一个小坑,明明在本地是可以正常运行的,但是一发到测试环境就报错了,说找不到文件,报错信息是:class path resource [xxxx] c ...

  8. 体细胞突变检测分析流程-系列1( WES&Panel)

    Sentieon●体细胞变异检测-系列1   Sentieon 致力于解决生物信息数据分析中的速度与准确度瓶颈,通过算法的深度优化和企业级的软件工程,大幅度提升NGS数据处理的效率.准确度和可靠性. ...

  9. 脱发秘籍:前端Chrome调试技巧汇总

    Chrome浏览器调试工具的核心功能: 注:本文测试.截图均为Edge浏览器(内核是Chromium),浏览器内核可了解<有哪些浏览器/内核?> 00.基础操作汇总 操作类型 快捷键/说明 ...

  10. c# 文件在线预览功能

    using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using DocumentF ...