首页 > 其他分享 >【效率提升】maven 转 gradle 实战

【效率提升】maven 转 gradle 实战

时间:2023-09-22 15:15:15浏览次数:43  
标签:实战 project gradle maven pegasus build com

一、灵魂三问

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 参考

作者:京东科技 宁利广

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

标签:实战,project,gradle,maven,pegasus,build,com
From: https://www.cnblogs.com/jingdongkeji/p/17722401.html

相关文章

  • PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni
    一、风哥PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni课程目标:本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL主从复制与高可用集群阶段之PostgreSQL高可用集群项目实战之Patroni,学完本课程可以掌握Patroni运行架构与基础知识,PostgreSQL+Patroni集......
  • PG-DBA培训20:PostgreSQL逻辑复制技术与项目实战
    一、风哥PG-DBA培训20:PostgreSQL逻辑复制技术与项目实战本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL主从复制与高可用集群阶段之PostgreSQL逻辑复制技术与项目实战,学完本课程可以掌握PostgreSQL逻辑复制基础与架构,PostgreSQL逻辑复制配置之内置默认,Post......
  • 机器学习初学与复习最佳教材—机器学习实战
    https://book.douban.com/subject/35218199/半年多几乎没碰机器学习,都快忘光了,虽然可能以后不做这方面研究,但作为实用小工具或者说基本技能来说还是很不错的!这本书的课后习题还可以用来复习概念。所以就有空整理一下里面的概念啦。《机器学习实战:基于Scikit-Learn、Keras和Tenso......
  • 【实战案例】技术转项目经理容易踩的坑,我都踩了
    “带团队容易,带好团队难。”这是身边一位项目经理近期在团队管理方面的深刻感悟。目前,他手上的一个项目被迫暂停了,项目团队也散了。下面给大家简要分享下这个项目案例。【案例分享】小李负责的是一个二次开发的项目,所涉及的需求较多,但小李之前是由技术转为项目经理的,所以他刚接到......
  • org/springframework/boot/maven/RepackageMojo has been compiled by a more recent
    项目场景:项目中执行clean,再执行install时报错,错误如下org/springframework/boot/maven/RepackageMojohasbeencompiledbyamorerecentversionoftheJavaRuntime(classfileversion61.0),thisversionoftheJavaRuntimeonlyrecognizesclassfileversionsupt......
  • c++并发编程实战-第4章 并发操作的同步
    等待事件或等待其他条件坐车案例想象一种情况:假设晚上坐车外出,如何才能确保不坐过站又能使自己最轻松?方法一:不睡觉,时刻关注自己的位置1#include<iostream>2#include<thread>3#include<mutex>4usingnamespacestd;56mutex_mtx;7boolbFlag=false;......
  • IDEA使用Maven的Tomcat7插件运行项目
    首先在插件商店安装MavenHelper<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</ve......
  • maven下载依赖失败
    问题导入的jar包在阿里云仓库中没有,于是将jar包复制到本地的maven仓库,仍然报错误,信息如下:duringapreviousattempt.Thisfailurewascachedinthelocalrepositoryandresolutionisnotreattempteduntiltheupdateintervalofalimavenhaselapsedorupdatesare......
  • 【JavaWeb3】Maven环境搭建
    前言:为什么要学习Maven?在JavaWeb开发中,需要使用大量的jar包,我们手动导入很麻烦,而学习Maven它可以帮我们自动配置和导入这些jar包Maven作为依赖管理工具,能够管理规模庞大jar包。使用Maven后,依赖对应的Jar包能够自动下载、方便、快捷且规范。Maven作为构建管理工具。当我们使用......
  • QT chart图表(温度曲线实战)
    (文章目录)前言本篇文章开始将带大家学习QTchart图表,后面我们将完成一个小项目,动态温度曲线,并且将本项目移植到ARM开发板上使用DHT11实时检测温度湿度。一、QChart介绍QT的QChart是一个用于绘制各种类型图表的QT库。它提供了丰富的图表类型和绘制工具,能够方便地绘制出统计图......