Gradle基础:9:wrapper的使用

article/2025/10/22 20:39:48

在这里插入图片描述
Gradle Wrapper是gradle建议的使用方式,这篇文章将会结合具体的例子来说明一下如何使用。

Gradle Wrapper

Gradle Wrapper实际上就是一个脚本,使用它可以下载和使用指定版本的gradle,根据需要进行在使用之前进行下载,有效避免本地机器的设定等环境一致性问题。
虽然gradle的安装已经非常简单,但是使用gradle wrapper是的开发这能够以一种更为标准化的方式创建gradle项目。

使用方式

Gradle Wrapper的使用方式主要是按照如下步骤:

  • Step 1: 下载gradle
  • Step 2: 将下载的gradle解压并存储至GRADLE_USER_HOME所指定的目录
  • Step 3: 使用解压的gradle
    在这里插入图片描述

事前准备

使用下面的代码示例,内容不再说明,具体说明信息请参看:

  • https://blog.csdn.net/liumiaocn/article/details/84230280
liumiaocn:wrapper liumiao$ ls
build.gradle
liumiaocn:wrapper liumiao$ cat build.gradle 
println "[phase:configuration] build.gradle ..."task compile {group 'compile'description 'compile task'println "[phase:configuration] compile"doFirst {println "[phase:execution] compile :doFirst()"}
}tasks.create(name: 'test',dependsOn: compile) {group 'test'description 'test task'println "[phase:configuration] test"doLast {println "[phase:execution] test:doLast()"}
}tasks.create("packaging") {group 'packaging'description 'packaging task'dependsOn testenabled   trueprintln "[phase:configuration] packaging"doLast {println "[phase:execution] packaging:doLast()"}
}class Install extends DefaultTask{String installObjectName@TaskActionvoid checkObject() {println "[phase:execution] install:checkObject   (${installObjectName})"}@TaskActionvoid installObject() {println "[phase:execution] install:installObject (${installObjectName})"}
}task install(type: Install) {group 'install'description 'install task'installObjectName 'test.jar'println "[phase:configuration] install"doFirst {println "[phase:execution] install:doFirst()"}doLast {println "[phase:execution] install:doLast()"}
}
install.dependsOn packaging
install.onlyIf { packaging.enabled }
liumiaocn:wrapper liumiao$

gradle wrapper

通过gradle tasks可以确认到在Build Setup tasks中有wrapper这样一个内建的任务。

liumiaocn:wrapper liumiao$ gradle tasks
...省略
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
...省略
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
liumiaocn:wrapper liumiao$ 

wrapper的说明是这个任务是用来创建gradle wrapper文件,接下里我们来看一下具体创建了那些文件

liumiaocn:wrapper liumiao$ ls
build.gradle
liumiaocn:wrapper liumiao$ gradle wrapper> Configure project :
[phase:configuration] build.gradle ...
[phase:configuration] compile
[phase:configuration] test
[phase:configuration] packaging
[phase:configuration] installBUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
liumiaocn:wrapper liumiao$ ls
build.gradle gradle       gradlew      gradlew.bat
liumiaocn:wrapper liumiao$ tree
.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat2 directories, 5 files
liumiaocn:wrapper liumiao$ 

文件说明:

  • gradlew:linux或者Unix下用于执行wrapper命令的Shell脚本
  • gradlew.bat:Windows下用于执行wrapper命令的批处理脚本
  • gradle-wrapper.jar:用于下载Gradle的相关代码实现
  • gradle-wrapper.properties:wrapper所使用的配置信息,比如gradle的版本等信息
  • 缺省状况下的gradle-wrapper.properties的信息如下
liumiaocn:wrapper liumiao$ cat gradle/wrapper/gradle-wrapper.properties 
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
liumiaocn:wrapper liumiao$

GRADLE_USER_HOME可以通过环境变量的方式设定,缺省的GRADLE_USER_HOME为 H O M E / . g r a d l e , 根 据 这 里 的 信 息 可 以 看 到 , 下 载 的 g r a d l e 将 会 解 压 到 {HOME}/.gradle,根据这里的信息可以看到,下载的gradle将会解压到 HOME/.gradlegradle{HOME}/.gradle/wrapper/dists

使用场景

当前系统安装的gradle的版本为4.10.2,但是在当前的project里面希望使用5.0的gradle,这时gradle wrapper就可以一显身手了

事前确认

当前gradle的版本为4.10.2

liumiaocn:wrapper liumiao$ gradle -v------------------------------------------------------------
Gradle 4.10.2
------------------------------------------------------------Build time:   2018-09-19 18:10:15 UTC
Revision:     b4d8d5d170bb4ba516e88d7fe5647e2323d791ddKotlin DSL:   1.0-rc-6
Kotlin:       1.2.61
Groovy:       2.4.15
Ant:          Apache Ant(TM) version 1.9.11 compiled on March 23 2018
JVM:          1.8.0_191 (Oracle Corporation 25.191-b12)
OS:           Mac OS X 10.14 x86_64liumiaocn:wrapper liumiao$

设定wrapper使用的gradle版本

可以使用命令来修改wrapper所使用的gradle版本信息

liumiaocn:wrapper liumiao$ gradle wrapper --gradle-version 5.0-rc-5 --distribution-type bin
Starting a Gradle Daemon (subsequent builds will be faster)> Configure project :
[phase:configuration] build.gradle ...
[phase:configuration] compile
[phase:configuration] test
[phase:configuration] packaging
[phase:configuration] installBUILD SUCCESSFUL in 3s
1 actionable task: 1 executed
liumiaocn:wrapper liumiao$

可以看到,实际这条命令只是修改了gradle wrapper的配置文件的下载文件的信息

liumiaocn:wrapper liumiao$ cat gradle/wrapper/gradle-wrapper.properties 
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-rc-5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
liumiaocn:wrapper liumiao$ 

当然设定也可以通过gradle-distribution-url选项或者直接修改配置文件来更快实现,至于具体版本,gradle的安装文件包符合:
gradle-版本信息-bin|all.zip的格式,按照这种格式即可
在这里插入图片描述

wrapper使用

只需要设定下载url所指定的gradle版本信息,wrapper的准备就已经就绪,随便使用任何一个wrapper的命令,第一次执行都会首先下载gradle并解压到${HOME}/.gradle/wrapper/dists,在在执行之前我们可以看到目前还没有任何内容

liumiaocn:wrapper liumiao$ ls
build.gradle gradle       gradlew      gradlew.bat
liumiaocn:wrapper liumiao$ ls ${HOME}/.gradle/wrapper/dists
ls: /Users/liumiao/.gradle/wrapper/dists: No such file or directory
liumiaocn:wrapper liumiao$ 

gradle wrapper之所以有被叫做wrapper,就是因为封了一层,所以gradle的基本命令在这里都可以使用,这里直接使用上文确认gradle版本所用的-v

liumiaocn:wrapper liumiao$ ./gradlew -v
Downloading https://services.gradle.org/distributions/gradle-5.0-rc-5-bin.zip
.................................................................................Welcome to Gradle 5.0-rc-5!Here are the highlights of this release:- Kotlin DSL 1.0- Task timeouts- Dependency alignment aka BOM support- Interactive `gradle init`For more details see https://docs.gradle.org/5.0-rc-5/release-notes.html------------------------------------------------------------
Gradle 5.0-rc-5
------------------------------------------------------------Build time:   2018-11-22 19:58:45 UTC
Revision:     42e59c2484a49702234030881640aa8d8bfa6d43Kotlin DSL:   1.0.4
Kotlin:       1.3.10
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          1.8.0_191 (Oracle Corporation 25.191-b12)
OS:           Mac OS X 10.14 x86_64liumiaocn:wrapper liumiao$

所以看到第一次执行有Downloading https://services.gradle.org/distributions/gradle-5.0-rc-5-bin.zip的动作,而具体的版本正是之前所设定的,gradle的下载和解压对我们来说都是透明的,为什么wrapper能找到这个5.0的版本呢

liumiaocn:wrapper liumiao$ ls ${HOME}/.gradle/wrapper/dists
gradle-5.0-rc-5-bin
liumiaocn:wrapper liumiao$ 

可以看到,wrapper把它下载并解压到这里了,当然也可以使用系统已经安装的gradle,这种方式直接设定GRADLE_USER_HOME即可。而且下载和设定的动作只会发生一次,除非你手动再次将其删除,现在再次使用gradlew就会清晰的多了

liumiaocn:wrapper liumiao$ ./gradlew -v------------------------------------------------------------
Gradle 5.0-rc-5
------------------------------------------------------------Build time:   2018-11-22 19:58:45 UTC
Revision:     42e59c2484a49702234030881640aa8d8bfa6d43Kotlin DSL:   1.0.4
Kotlin:       1.3.10
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          1.8.0_191 (Oracle Corporation 25.191-b12)
OS:           Mac OS X 10.14 x86_64liumiaocn:wrapper liumiao$

接下来就可以想使用gradle一样使用gradlew了,比如需要执行install的任务

liumiaocn:wrapper liumiao$ ./gradlew install
Starting a Gradle Daemon (subsequent builds will be faster)> Configure project :
[phase:configuration] build.gradle ...
[phase:configuration] compile
[phase:configuration] test
[phase:configuration] packaging
[phase:configuration] install> Task :compile
[phase:execution] compile :doFirst()> Task :test
[phase:execution] test:doLast()> Task :packaging
[phase:execution] packaging:doLast()> Task :install
[phase:execution] install:doFirst()
[phase:execution] install:installObject (test.jar)
[phase:execution] install:checkObject   (test.jar)
[phase:execution] install:doLast()BUILD SUCCESSFUL in 3s
4 actionable tasks: 4 executed
liumiaocn:wrapper liumiao$ 

可以看到同样的脚本在gradle 5中也能正常运行

总结

gradle wrapper对于较为熟悉设定用户来说,似乎更像一个鸡肋的功能,因为gradle本身的设定就非常简单,但是对于团队开发来说,这种事情如果能够坐等透明化和标准化对于项目来说自然是很不错的一个方式,也是我们在推行DevOps时对于开发环境标准化的一个小的实践。

参考内容

https://docs.gradle.org/current/userguide/gradle_wrapper.html


http://chatgpt.dhexx.cn/article/bk6egRgt.shtml

相关文章

spring boot之maven-wrapper

Spring Boot有很多功能特性值得借鉴和学习,很多玩Spring Boot的人知道不需要安装Tomcat很方便,其实并没有发现Maven也是不需要提前安装。它这样做的好处在于解决了开发环境maven版本不一致导致的各种问题,spring boot中集成了maven-wrapper的…

dubbo之SPI Wrapper分析

写在前面 本文需要dubbo SPI的简单基础知识,对dubbo SPI不了解的朋友可以参考dubbo之SPI分析 。 源码!!!。 在dubbo之SPI分析 文章中我们分析了SPI机制,其中有种SPI是一个Wrapper类的情况,本文一起来看下Wr…

MyBatis与QueryWrapper

目录 一、MyBatis标签 1.2 if标签 1.2 foreach标签 1.3 sql标签 1.4 where标签 1.5SQL片段的使用 二、条件构造器 2.1QueryWrapper 2.1.1查询 2.1.2 查询列2 2.1.2 删除 2.1.3子查询 2.1.4组装查询条件 2.1.5组装排序条件 2.1.6组装删除条件 2.1.7条件的优先级 2.1.8 子…

QueryWrapper常用方法

QueryWrapper常用方法 MybatisPlus 使用QueryWrapper测试用例 一、ge、gt、le、lt、isNull、isNotNull Test public void testQuery() { QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.isNull("name").ge("age", 12)…

java service wrapper 中文_Java Service Wrapper实践

很久前就使用JAVA写了一个后台服务器,基于MINA框架的。并且一直部署运行于服务器中,当然有一个黑框框。 就正常运行而言,此种运行方式没有任何问题。 但是就这运行期间出现的一些问题: 1,服务器问题重启后,每次都要登录远程将服务器打开,即使我已经配置了开机自启动,但…

Gradle Wrapper 详解

Gradle Wrapper 详解 我们介绍了 Android 项目的目录及 Gradle 配置&#xff0c;我们提到有个目录是/gradle/wrapper。今天这篇文章我们来学习 Gradle Wrapper。通过这篇文章我们将了解什么是 Gradle Wrapper&#xff1f;为什么需要用 Gradle Wrapper&#xff1f;以及 Gradle …

wrapper java 64_Wrapper配置详解及高级应用

将一个简单的程度如HelloWorld 的应用包装秤Wrapper 服务并不复杂&#xff0c;甚至可以认为非常简单。但是实际项目应用过程中我们的程序一般较庞大&#xff0c;运行环境也较复杂。 通过Wrapper 配置文件的分析与配置进一步了解构建Wrapper 服务需要注意的关键点及重要部分。 首…

RDP Wrapper

说到要在非Windows Server版本上实现多用户远程桌面连接 &#xff0c;我们都知道一个大名鼎鼎的软件RDP Wrapper Library&#xff0c;它是开源的&#xff0c;所有秘密作者都没有保留&#xff0c;所有问题全部在GitHub上面写的清清楚楚&#xff0c;在这里感谢这些伟大的人&#…

wrapper后台启动java程序

文章目录 1&#xff0c;下载wrapper2&#xff0c;使用wrapper后台启动java程序2.1&#xff0c;编写java样例程序2.2&#xff0c;配置wrapper2.3&#xff0c;拷贝启动脚本2.4&#xff0c;启动服务 1&#xff0c;下载wrapper 下载地址&#xff1a;https://wrapper.tanukisoftwar…

Java常用类-包装类(Wrapper)简单介绍

目录 前言1、包装类(Wrapper) 前言 本文主要介绍java中的包装类 1、包装类(Wrapper) Java是面向对象的编程语言&#xff0c;但它也包含了8种基本数据类型&#xff0c;这8种基本数据类型不支持面向对象的编程机制&#xff0c;基本数据类型的数据也不具备“对象”的特性&#…

强大的wrapper

最近在看大数据和容器相关的东西&#xff0c;发现有一个模式被反复使用到&#xff0c;关键是被用的很恰当且优雅&#xff0c;并能在这些关键技术中都发挥着至关重要的核心作用。我想你已经猜到了&#xff0c;他就是Eminem——强大的rapper——哦&#xff0c;不对&#xff0c;是…

mybatis-plus中wrapper的用法(详细)

用到了wrapper&#xff0c;ge、le、ne、eq等的用法&#xff0c;及多表查询自写sql整理资料记录一下&#xff0c;以备后续复习。 目录------------&#xff08;可点击相应目录直接跳转&#xff09; 一、条件构造器关系介绍 条件构造器关系介绍 &#xff1a; wapper介绍 &…

锚点(anchorPoint)

转载请说明出处&#xff0c;谢谢。 原文出处&#xff1a;点击打开链接 今天研究了一下关于layer的anchorPoint问题。 附图&#xff1a; 原文出处&#xff1a;点击打开链接 位置坐标 position&#xff0b;anchorPoint&#xff08;左下角0,0原点坐标系&#xff09;。 要确…

cocos2d-x中的锚点(AnchorPoint)理解

锚点的定义 锚点是指节点在进行形状变换、位置变动时依据的基准点。可以想象为钉在墙上用于固定纸张的小图钉&#xff0c;或者公告栏上用于固定纸张用的围棋状的小磁粒。当对某个节点调用setPosition时&#xff0c;cocos2d-x即会将其锚点移动到相应位置&#xff1b;当对节点进行…

cocos2d-x3.2总结(一)Position和AnchorPoint的关系

当cocos2d-x引擎需要绘图时&#xff0c;就需要Position和AnchorPoint等属性。例如&#xff1a;在创建一个Sprite时&#xff0c;要设置Sprite的Position&#xff0c;而我们常常没有设置AnchorPoint&#xff0c;这是因为精灵的AnchorPoint默认值为&#xff08;0.5,0.5&#xff09…

Anchor3

这里介绍如何修改 Anchor 的尺寸来提高小目标的检测效果,算法tricks优化小目标检测 修改 Anchor 尺寸 在实际的应用场景中&#xff0c;我们按照 MS COCO 标准中把大小不大于 32x32 或者占原始图片比率不足 0.01 的目标物体定义为一个小目标物体。 在使用 Anchor 的检测算法&…

ios-anchorPoint、position理解

anchorPoint(锚点)是layer的一个属性&#xff0c;下面我们来看看其对view的影响&#xff0c;本文主要通过图片方式展现&#xff1a; 锚点用单位坐标来描述也就是图层的相对坐标。在苹果文档中说明左下是(0,0),右上是&#xff08;1&#xff0c;1&#xff09;&#xff0c;mac系统…

Anderson‘s pointer analysis

本文是垃圾文章&#xff0c;请直接学习其它资料 南京大学《软件分析》课程08&#xff08;Pointer Analysis&#xff09;https://www.cs.cmu.edu/~aldrich/courses/15-819O-13sp/resources/pointer.pdf 指针分析 指针分析是一类特殊的数据流问题&#xff0c;它是其它静态程序分析…

iOS围绕某点缩放或旋转的AnchorPoint的设定

经常会遇到需求&#xff0c;要求手势的缩放或者旋转操作&#xff0c;要求动作变化围绕某一个特定点&#xff0c;或者是两指的中心点&#xff0c;或者是某一个点。 这个问题首先要清晰的知道&#xff0c;iOS各个view的层次关系。特别是&#xff0c;要清除的知道&#xff0c;当前…

彻底理解CALayer的position与anchorPoint

引言 相信初接触到CALayer的人都会遇到以下几个问题&#xff1a; 为什么修改anchorPoint会移动layer的位置&#xff1f; CALayer的position点是哪一点呢? anchorPoint与position有什么关系&#xff1f; 我也迷惑过&#xff0c;找过网上的教程&#xff0c;大部分都是复制粘…