gradle build和gradlew build的区别

接之前写的一篇小文《gradle项目开发环境搭建》, 我们观察一下gradle项目中的文件

其中我们看到了gradlew 和 gradlew.bat 文件, 有点经验的人都知道, 前者是linux上用的, 后者是Windows下用的, 但从作用上来讲, 两者没有本质区别. 那么接上一文的疑问, gradlew 的作用是什么呢? 它和gradle命令有什么区别?

答: gradle是因为我们本机安装了gradle而且配置了环境变量所以产生的命令. 而gradlew是为了统一项目组中的成员的gradle版本而引入的文件. 提到gradlew就不得不提到gradle项目根路径下面的gradle目录, 里面有一个wrapper目录,其中有2个文件, 一个是gradle-wrapper.jar,一个是gradle-wrapper.properties, 值得注意的是后者

1
2
3
4
5
6
7
8
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
# 发布包的基地址, 所以我们需要配置环境变量GRADLE_USER_HOME为gradle的安装目录,我的是D:\gradle-3.5.1
zipStoreBase=GRADLE_USER_HOME
# 发布包下载到的地址(相对于zipStoreBase)
zipStorePath=wrapper/dists
# 发布包的网络地址
distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-bin.zip

因此看到这里我们就不难明白为什么要配置GRADLE_USER_HOME环境变量, 以及为什么使用gradlew都不需要项目组成员本机事先安装好gradle了, 第一次执行

1
gradlew build

会先到上面配置文件中的distributionUrl所指示的地址去下载gradle到 %GRADLE_USER_HOME%/zipStorePath 中去, 然后使用该下载好的gradle对我们的项目进行构建. 这就起到了约束项目组成员使用gradle版本一致的作用. 但是第二次再次执行的话, 是不会下载的.

所以

1
gradle build

1
gradlew build

的区别在于, 前者使用本机安装好并配置好环境变量的gradle进行项目构建, 后者从网上下载统一的版本之后再构建.

举一反三,

1
gradle bootRun

1
gradlew bootRun

的区别也是如此.