关于gradle:效率提升maven-转-gradle-实战-京东云技术团队

一、灵魂三问1、gradle 是什么?一个打包工具, 是一个开源构建自动化工具,足够灵便,能够构建简直任何类型的软件,高性能、可扩大、能洞察等。其中洞察,能够用于剖析构建过程中数据,提供剖析参考,不便排查问题和一直优化构建性能,以下一次编译剖析报告。 2、有什么劣势参考官网文章,针对蕴含10 子模块的工程,绝对 maven 构建速度,大略有 2-3 倍的性能晋升,增量编译大略 7 倍的性能晋升,参考官网 实测比照: gradle 耗时maven 耗时全新构建(clean 及下载依赖包)1m 35s1m58s全新构建(clean)43s60s增量构建14s43sgradle 执行命令: 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.12、执行迁徙命令在以后 maven 工程下,执行如下的命令。 gradle init Found a Maven build. Generate a Gradle build from this? (default: yes) [yes, no] yesSelect build script DSL: 1: Groovy 2: KotlinEnter selection (default: Groovy) [1..2] 1Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] no不出意外下,会在默认子模块下增加 build.gradle 文件,如下图: ...

September 22, 2023 · 2 min · jiezi

关于gradle:IDEA-使用-gradle-乱码之谜

指标理解乱码的成因理解乱码的定位形式和解决办法 为什么须要编码呢?因为字符串是须要编码成字节数组作为载体的来存储和传输. 为什么会乱码?乱码产生的起因个别是因为编码转换出错. 字符串常见编码有GBK和UTF-8等. 如果一个字符串的编码和解码形式不一样, 就会呈现乱码. 例如是通过UTF-8编码的, 但通过GBK来解码, 就会变成上面的样子. 字节数组: [-28, -67, -96, -27, -91, -67]UTF-8解码后: 你好GBK解码后: 浣犲ソ 如果是通过GBK编码, 但通过UTF-8解码, 就会变成上面的样子.UTF-8解码后: ���GBK解码后: 你好 下面是常见的乱码, 能够记住乱码表现形式, 如果是相似的乱码, 就能够大略晓得是什么编码问题了. 如何模仿乱码如果让你写一个java程序, 模仿乱码的状况, 你会怎么写? java程序模仿乱码上面这么写会不会有问题, 在编辑器 (例如 IDEA) 外面的控制台看到的是 "浣犲ソ"吗? public static void main(String[] args) throws IOException { System.out.println(new String("你好".getBytes("UTF-8"), "GBK"));}答案是 不肯定. 程序编解码剖析你在控制台看到的字符串通过层层转换最终能力出现后果, 上面5局部都会对字符串的出现产生影响: .class 文件的编码getBytes("UTF-8") 进行转码获取对应编码的字节数组new String(,"GBK") 进行解码用于显示字符串System.out.println 编码后转成字节流写入控制台控制台读取字节流数据进行编码后出现在控制台下面 .class 文件的编码.class 编码默认是UTF-8的. 但 .java 不肯定. jdk编译器会把 .java 转成 .class. 意味着.java的编码和编译器程序的解码必须是统一的, (IDEA批改编译编码的形式在备注1)否则会呈现上面的状况, 尽管 .java外面显示的是 "你好", 但实际上变量的内容是 "浣犲ソ"! ...

January 31, 2023 · 2 min · jiezi

关于gradle:微服务开发系列为什么用-gradle-构建

构建在该微服务架构中,并没有应用常见的 maven 作为管理工具,而是应用了 gradle。 我在应用 maven 搭建这个架构实现了大部分的工作之后,决定全面转向 gradle,花了四天的工夫才全面相熟与替换。 总结一下这个我的项目中为什么应用 gradle,以及应用 gradle 须要恪守的规定。 1 maven 与 gradle两者相比拟思维是一样的,都是治理 jar 的依赖版本,定义了一个我的项目从编译到打包两头的各个阶段。 在应用下来之后发现,对于小型或者单个我的项目,应用 maven 与 gradle 实际上没有什么差异,甚至 小型我的项目 maven 更加不便一些,因为配置都是提前定义好的,不须要做过多的配置,就能间接应用,而 gradle 想要用起来配置略微麻烦一些。 然而对于多模块我的项目,两层甚至三层我的项目构造时,应用 gradle 相对是必须的,应用 maven 经常不能达到的目标,在 gradle 外面轻松就可能实现。 两者基本的区别是,maven 是配置型的,配置的设计依赖于配置的设计者是否留有批改的接口,gradle 是脚本型的,如何配置绝大部分取决于使用者如何设计。 一个主动权在 maven 插件作者,一个主动权在 gradle 的使用者。1.1 mavenmaven 的配置是固定的,不可批改的,只能基于配置上做定制化的革新,略微超出配置之外的操作,就要通过插件扩大来实现。 比如说我心愿打包的时候将 git sha1 作为版本号,你必须要装置一个 git-commit-id-plugin 插件。 在单层构造下没什么,齐全能够达到我应用的目标,两层构造也勉强够用,三层构造貌似也没什么问题。 然而当我应用心愿把一个我的项目提供给其它所有我的项目作为依赖时,问题就来了 \--- server +---framework +---gateway \---business +---business-foundation +---business-webframework 就是我将要提供给所有我的项目作为根本依赖。在这个需要外面,maven 有两个问题解决不了: git-commit-id-plugin 插件提供的变量 git.commit.id.abbrev 没法传递 dependency,像上面的形式,就无奈实现,因为插件在解决依赖时是不失效的,只有在编译打包的时候能力失效,因而变量也就无奈提供。 <dependency> <groupId>cn.server</groupId> <artifactId>framework</artifactId> <version>${git.commit.id.abbrev}</version> </dependency>maven 无奈解决我的项目之间的循环依赖,如果心愿各个我的项目不必本人手动援用 framework ,那么我就要在顶层去援用,然而 framework 也在这个框架之中,parent 曾经被指定顶层我的项目是 server,当然不指定 parent 是 server,可能很轻易的解决这个问题,然而在 parent 中的其它援用,都要在 framework 中被从新援用一遍,并且还不能设置 framework 的版本变量。这两个问题困扰了我十分久,直到应用 gradle 替换了之后。 ...

September 19, 2022 · 2 min · jiezi

关于gradle:gradle环境搭建

操作系统 - CentOS$ cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)what's needed?OpenJDKAndroid-SDKgradle装置Open JDK# 参考文档https://openjdk.java.net/install/# 官网装置阐明Fedora, Oracle Linux, Red Hat Enterprise Linux, etc.On the command line, type:$ su -c "yum install java-1.8.0-openjdk"The java-1.8.0-openjdk package contains just the Java Runtime Environment. If you want to develop Java programs then install the java-1.8.0-openjdk-devel package.# yum装置java# java-1.8.0-openjdk只是运行环境,java-1.8.0-openjdk-devel是开发环境yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel# 获取JAVA_HOME$ which java/usr/lib/jvm/java-1.8.0-openjdk/bin/java# JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk# 配置环境变量export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export PATH=$PATH:$JAVA_HOME/binexport CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar装置Android-SDK# 下载android sdk压缩包# 手动http://sdk.android-studio.org/ ,抉择你要的版本#主动 wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz# 解压$ mkdir android-sdk$ mv android-sdk_r24.4.1-linux.tgz android-sdk/$ cd android-sdk && tar xzvf android-sdk_r24.4.1-linux.tgz# 配置环境变量export ANDROID_HOME=~/android-sdk/android-sdk-linuxexport PATH=$ANDROID_HOME/tools:$PATHexport PATH=$ANDROID_HOME/platform-tools:$PATH# 更新下载android组件# 更新全副android update sdk --no-ui# 抉择更新android list sdk --all #列出所有包和对应的序号android update sdk -u --all --filter 序号1,序号2...# 查看是否装置胜利adb装置gradle# 下载gradle压缩包# 手动 https://services.gradle.org/distributions/ ,抉择你要的版本# 主动wget https://services.gradle.org/distributions/gradle-6.5-bin.zip# 解压mkdir ~/local/gradlemv gradle-6.5-bin.zip ~/local/gradle/cd ~/local/gradle/ && unzip gradle-6.5-bin.zip# 配置环境变量export GRADLE_HOME=~/local/gradle/gradle-6.5export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:${GRADLE_HOME}/bin:${JAVA_HOME}:${PATH}# 查看是否装置胜利gradle -v

February 9, 2022 · 1 min · jiezi

关于gradle:Gradle入门

Gradle是什么?一个开源的我的项目自动化构建工具,建设在Apache Anthe和Apache Maven概念的根底上,引入了基于Groovy的特定畛域语言(DSL),而不再应用XML模式治理构建脚本。 为什么须要我的项目自动化构建工具?对于大部分的软件开发者都会面临上面的问题: 开发人员都会应用IDE来进行编码,IDE帮用户实现了代码环境配置,编译代码,重构优化代码等性能。但因为不同开发人员应用的IDE版本不一样,可能会导致其他人在IDE中无奈胜利运行程序。在开发过程中,开发人员个别会调用很多现有的类库,这些类库不仅数量繁多,而且版本也千差万别。要想让程序正确执行,咱们必须要够引入适合的类库。在软件开发实现后,开发人员还要对软件进行一系列测试后能力让产品上线,然而须要测试的代码有许多,手动一个一个测试会重大影响产品迭代的效率。产品在公布之前,开发人员须要将代码进行打包,并上传到相应的云端。人为管制这个过程会很繁琐,同时也极易出错。对于上述的问题,咱们心愿能有一个工具帮咱们解决,于是我的项目自动化构建工具就应运而生了。 我的项目自动化构建工具的作用进行依赖治理自动化测试、打包、公布的过程Gradle的组织模式在Gradle构建中有两个根本的概念,别离为我的项目(project)和工作(task),每个构建至多蕴含一个我的项目,我的项目中蕴含一个或者多个工作。 我的项目(project)一个我的项目代表一个正在构建的组件(比方编译代码,将代码打包成一个jar文件),当构建启动后,Gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且可能通过project变量使其隐式可用。 工作(task)对于之前提到的构建需要,咱们不难看出: 每个构建需要都须要实现特定的性能,比方在构建过程中须要管制类库的版本,对代码进行编译等。不同的构建需要之间有前后的依赖关系,比方测试过程必须是在代码编译后能力进行。于是,Gradle定义了工作(Task)来组织构建的过程。工作是指实现最小的工作单元,不同的工作通过构建一个有向无环图来示意工作之间的依赖,具体过程如下图: 我的项目实例整体介绍 对于一个我的项目来说,次要进行我的项目依赖管制的文件是"build.gradle"。这个文件在根目录下必须存在,用于对整个我的项目进行配置。对于子模块,如果须要进行自动化构建的话,那么对应的文件夹上面也须要蕴含build.gradle的文件。 创立工作Gradle中所有的工作都是通过task定义的,每个工作实现了一种性能,我定义的这个工作实现了创立文件夹的性能。同时,工作之间能够依赖,通过应用dependOn来依赖其余的工作。这个依赖表明须要在申明依赖的地位执行对应依赖的工作。 构建的生命周期次要蕴含三个阶段,别离为初始化,配置,执行。 初始化阶段初始化所有参加到构建中的我的项目。能够了解为这个阶段次要确定哪些模块须要参加到构建中(比方只有上图的model模块参加到构建中),哪些工作须要蕴含到构建中(工作能够定义多个,并不是所有工作都须要执行,所以须要确定参加到构建的工作)。 配置阶段生成task的依赖程序以及执行程序,依据配置代码来生成,在工作的定义中,除了动作代码(doFirst,doLast)以外的代码叫配置代码。 执行阶段执行动作代码。 在构建的过程中,gradle还提供了钩子代码,钩子代码是指在构建的每个阶段执行完结后能够插入的代码。比方我须要在初始化阶段后给用户提醒初始化实现,那么我能够在下图Hook的地位插入代码,输入肯定的提示信息。

August 9, 2021 · 1 min · jiezi

关于gradle:Gradle-GitHub-Actions-自动发布项目至-Maven-仓库

摘要文章内容外围是应用 Gradle 整合 GitHub Actions 自动化公布 Java 我的项目至 Maven 仓库。文章内是将我的项目公布至 sonatype 提供的仓库中。如果你须要自动化公布,或者须要将我的项目同步至 Maven 地方仓库请仔细阅读。 后期筹备可同步 Maven 地方仓库的门票,在 Issues Sonatype 上申请;OpenPGP 证书,须要同步至公共的服务器;一个 Java Project;GitHub。对于同步门票局部可参考提供的链接,文章内次要叙述证书相干的内容。 OpenPGP 证书因我应用的 Windows 操作系统这里应用 Gpg4win 工具生成同步证书。如果你应用的是 Mac 或者 Linux 操作系统可应用其它 GPG 工具如 GnuPG。 装置 Gpg4win下载地址 Gpg4win。 生成证书$ gpg --full-generate-key运行下面的命令依照批示生成 RSA 的证书。 C:\Users\admin>gpg --full-generate-keygpg (GnuPG) 2.2.23; Copyright (C) 2020 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.... 省略局部 ...public and secret key created and signed.pub rsa3072 2020-11-10 [SC] [expires: 2021-11-10] 449B75F00B2DA482AB8D03E8493DA88E2B89E19Fuid kk70-blog (blog) <kevinz@weghst.com>sub rsa3072 2020-11-10 [E] [expires: 2021-11-10]浏览证书能够应用 gpg --list-secret-keys --keyid-format SHORT 命令查问证书列表。 ...

November 11, 2020 · 3 min · jiezi

关于gradle:Gradle系列之Android-Gradle插件

原文发于微信公众号 jzman-blog,欢送关注交换。通过后面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相干的常识,对于 Gradle 及其插件相干常识请先浏览上面几篇文章: Gradle系列之初识GradleGradle之Groovy根底篇Gradle系列之构建脚本根底Gradle系列之意识Gradle工作Gradle系列之Gradle插件Gradle系列之Java Gradle插件学习 Gradle 的目标次要是为了更好的在 Android 开发中应用 Gradle,这篇文章的次要内容是 Android Gradle 插件的相干常识,次要内容如下: 理解 Android Gradle 插件Android Gradle 插件分类应用 Android Gradle 插件Android Gradle 工程目录Android Gradle 根本配置Android Gradle 工作理解 Android Gradle 插件顾名思义,Android Gradle 插件就是一个用于 Android 构建我的项目的一个 Gradle 插件,该插件有 Google Android 开发团队开发,而且 Android 开发 IDE Android Studio 就采纳 Gradle 构建我的项目,上面是 Android Gradle 插件的劣势: 不便重用代码和资源;可更不便的创立利用的衍生版本,如多渠道打包;配置不便。能够扩大,还能够自定义构建过程Android Studio 与 Gradle 深度交融Android Gradle 插件分类Android 插件的分类是依据 Android 工程的属性进行分类的,Android 工程分为三类,具体如下: ...

August 23, 2020 · 2 min · jiezi

关于gradle:Gradle系列之Java-Gradle插件

原文发于微信公众号 jzman-blog,欢送关注交换。上篇文章中理解了 Gradle 插件相干常识以及如何自定义一个 Gradle 插件,为不便了解能够先浏览上面几篇文章: Gradle系列之初识GradleGradle之Groovy根底篇Gradle系列之构建脚本根底Gradle系列之意识Gradle工作Gradle系列之Gradle插件本篇文章次要来学习 Java Gradle 插件相干的常识,因为 Java Gradle 插件相干的内容也是 Android Gradle 插件的根底。应用 Gradle 来构建我的项目无非就是帮忙开发者做一些重复性的工作,如配置第三方依赖、编译源文件、单元测试、打包公布等,应用相应的 Grade 插件可不便我的项目的构建以及肯定水平上进步开发效率,上面是明天学习的次要内容: Java Gradle 插件的应用Java 插件约定的我的项目构造配置第三方依赖如何构建 Java 我的项目SourceSet 源集概念Java 插件可增加的工作Java 插件可增加的属性多我的项目构建公布构件Java Gradle 插件的应用应用一个 Gradle 插件应用的是 Project 的 apply() 办法: //java是Java Gradle插件的plugin idapply plugin:'java'应用 Java 插件之后会为以后工程增加默认设置和约定,如源代码的地位、单元测试代码的地位、资源文件的地位等,个别应用默认设置即可。 Java 插件约定的我的项目构造Java 插件设置一些默认的设置和约定,上面来看一看 Java 我的项目的默认工程目录,目录构造根本如下: JavaGradle└─src ├─main │ ├─java │ └─resources └─test ├─java └─resources下面目录构造中,src/main/java 默认是源代码寄存目录,src/main/resources 是资源文件、配置文件等目录,arc/test 上面的目录当然是与其绝对应的单元测试相干文件的存储目录,main 和 test 是 Java Gradle 插件内置的两个源代码汇合,当然除此之外能够本人定义其余源代码汇合,定义形式如下: ...

August 23, 2020 · 2 min · jiezi

关于gradle:Gradle系列之认识Gradle任务

原文发于微信公众号 jzman-blog,欢送关注交换。后面几篇学习了 Gradle 构建工作的基础知识,理解了 Project 和 Task 这两个概念,倡议先浏览后面几篇文章: Gradle系列之初识GradleGradle之Groovy根底篇Gradle系列之构建脚本根底Gradle 的构建工作是有一系列的 Task 来实现的,本文将针对 Task 进行具体介绍,本文次要内容如下: 多种形式创立工作多种形式拜访工作工作分组和形容操作符工作的执行剖析工作排序工作的启用和禁用工作的onlyIf断言工作规定多种形式创立工作Gradle 中能够应用多种形式来创立工作,多种创立工作的形式最终反映在 Project 提供的快捷办法以及内置的 TaskContainer 提供的 create 办法,上面是几种常见的创立工作的形式: /** * 第一种创立工作形式: * 办法原型:Task task(String name) throws InvalidUserDataException; *///定义Task变量接管task()办法创立的Task,办法配置创立的Taskdef Task taskA = task(taskA)//配置创立的TasktaskA.doFirst { println "第一种创立工作的形式"}/**task * 第二种创立工作形式:可在Map参数中进行相干配置,如依赖、工作形容、组别等 * 办法原型:Task task(Map<String, ?> args, String name) throws InvalidUserDataException; */def Task taskB = task(group: BasePlugin.BUILD_GROUP,taskB,description: "形容")//配置创立的TasktaskB.doLast { println "第二种创立工作的形式" println "工作taskB分组:${taskB.group}" println "工作taskB形容:${taskB.description}"}/** * 第三种创立工作形式:通过闭包的形式创立Task,闭包里的委托对象就是Task,即可在闭包内调用Task * 的所有属性和办法来进行Task的配置 * 办法原型:Task task(String name, Closure configureClosure); */task taskC{ description 'taskC的形容' group BasePlugin.BUILD_GROUP doFirst{ println "第三种创立工作的形式" println "工作taskC分组:${group}" println "工作taskC形容:${description}" }}/** * 第四种创立工作的形式:可在闭包中灵便配置,也可在Map参数中配置,闭包中中的配置父笼罩Map中雷同的配置 * 办法原型:Task task(Map<String, ?> args, String name, Closure configureClosure); */def Task taskD = task(group: BasePlugin.BUILD_GROUP,taskD,description: "形容"){ description 'taskD的形容' group BasePlugin.UPLOAD_GROUP doFirst{ println "第四种创立工作的形式" println "工作taskD分组:${group}" println "工作taskD形容:${description}" }}下面是创立工作的四种形式,应用时抉择适合的创立形式即可,下面提到 Map 中能够配置 Task 的相干参数,上面是是 Map 中可应用的配置: ...

August 15, 2020 · 4 min · jiezi

buildgradle里dependencies标签页的实现原理

build.gradle里的dependencies标签页: 如果把dependencies改成dependencies2, gradle build的输入会遇到谬误音讯: A problem occurred evaluating root project 'quickstart'.Could not find method dependencies2() for arguments [build_a2307i03s3k13jdug3afl2lin$_run_closure3@21c69f73] on root project 'quickstart' of type org.gradle.api.Project. 找到这个org.gradle.api.Project类,位于目录orggradleapi上面: 关上Project.java, 查看对于dependencies的阐明: <p>A project generally has a number of dependencies it needs in order to do its work. Also, a project generallyproduces a number of artifacts, which other projects can use. Those dependencies are grouped in configurations, andcan be retrieved and uploaded from repositories. You use the {@link org.gradle.api.artifacts.ConfigurationContainer}returned by {@link #getConfigurations()} method to manage the configurations. The {@linkorg.gradle.api.artifacts.dsl.DependencyHandler} returned by {@link #getDependencies()} method to manage thedependencies. The {@link org.gradle.api.artifacts.dsl.ArtifactHandler} returned by {@link #getArtifacts()} method tomanage the artifacts. The {@link org.gradle.api.artifacts.dsl.RepositoryHandler} returned by {@linkgetRepositories()} method to manage the repositories.</p>Project是一个接口: ...

July 12, 2020 · 2 min · jiezi

buildgradle里repositories的mavenCentral实现原理解析

如果把build.gradle里的mavenCentral改成mavenCentral2会产生什么事? 谬误音讯:Could not find method mavenCentral2() for arguments [] on repository container of type org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler. 这个DefaultRepositoryHandler,到Gradle目录下搜寻,找到了对应的Java文件: DEFAULT_MAVEN_CENTRAL_REPO_NAME常量的定义在下列文件里: DefaultBaseRepositoryFactory的createMavenCentralRepository办法内,创立Maven仓库,url为Repository.MAVEN_CENTRAL_URL: 这个常量定义在文件ArtifactRepositoryContainer.java里: String MAVEN_CENTRAL_URL = "https://repo.maven.apache.org/maven2/"; 浏览器里能够关上这个url,外面寄存着各种开发库: 因而build.gradle里下列这段配置信息,意思是通知Gradle从Maven地方仓库获取工具库的内容,即url https://repo.maven.apache.org... 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

July 12, 2020 · 1 min · jiezi