Gradle介绍
Gradle是源于Apache Ant和Apache Maven概念的项目自动化构建开源工具,它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置面向Java应用为主。当前其支持的语言暂时有Java、Groovy、Kotlin和Scala。
Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。
官网
https://gradle.org/
Groovy语言
init.gradle & 配置阿里云仓库
阿里云仓库使用指南> https://maven.aliyun.com/mvn/guide
init.gradle文件在build开始之前执行,所以你可以在这个文件配置一些你想预先加载的操作
buildscript {
repositories {
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url 'https://plugins.gradle.org/m2/' }
}
}
allprojects {
repositories {
def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public'
def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
remove repo
}
}
}
maven {
url ALIYUN_REPOSITORY_URL
url ALIYUN_JCENTER_URL
}
}
}
build.gradle
// 需要引进的相关插件Plugins
plugins {
// Spring boot
id 'org.springframework.boot' version '2.6.7'
// Maven
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
// 'java' 表示应用java插件,添加对java的支持
id 'java'
// 'idea' 表示应用idea插件,添加对idea的支持
id 'idea'
}
group = 'com.lps'
version = '0.0.1'
sourceCompatibility = '11'
// repositories闭包 存储库
// 声明在何处查找项目的依赖项
//一定要注意区别开 什么是仓库 什么是依赖
//仓库用于存储依赖,依赖就相当于货物,存放在仓库中。
repositories {
// 需要配置GRADLE_USER_HOME 这个环境变量, 指定使用(maven)本地仓库,而本地仓库在配置maven时setting文件指定的仓库位置。
// mavenLocal()
maven{
name "aliyun"
url 'https://maven.aliyun.com/repository/public'
}
// 这是Maven的中央仓库,无需配置,直接声明就可以使用
mavenCentral()
// JCenter中央仓库,实际也是是用的maven搭建的,但相比Maven仓库更友好,通过CDN分发,并且支持https访问。
// jcenter()
}
// dependencies闭包 依赖
// 是用于声明这个项目依赖于哪些jar
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
implementation 'com.alibaba:druid:1.1.19'
// implementation 'junit:junit:4.12'
implementation 'com.auth0:java-jwt:3.4.0'
// implementation 'org.springframework.boot:spring-boot-starter-websocket'
implementation 'cn.hutool:hutool-all:5.3.8'
implementation 'com.alibaba:fastjson:1.2.70'
implementation 'org.bouncycastle:bcprov-jdk15on:1.65'
implementation 'commons-lang:commons-lang:2.6'
implementation 'commons-io:commons-io:2.4'
implementation 'com.aliyun.oss:aliyun-sdk-oss:2.4.0'
implementation 'commons-fileupload:commons-fileupload:1.3.1'
runtimeOnly 'mysql:mysql-connector-java'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
//(扩展)对于各种依赖方式的说明
//implementation
//这个指令的特点就是,对于使用了该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而//不对外部公开。
//api
//完全等同于compile指令
//compile
//这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
//testCompile
//testCompile 只在单元测试代码的编译以及最终打包测试apk时有效。
//debugCompile
//debugCompile 只在debug模式的编译和最终的debug apk打包时有效。
//releaseCompile
//releaseCompile 仅仅针对Release模式的编译和最终的Release apk打包
//provided
//只在编译时有效,不会参与打包,可以在自己的moudle中使用该方式依赖。比如com.android.support,gson这些使用者常用的库,避免冲突。
//apk(runtimeOnly)
//只在生成apk的时候参与打包,编译时不会参与,很少用。
tasks.named('test') {
useJUnitPlatform()
}
GRADLE_USER_HOME和Gradle user home的区别
环境变量的GRADLE_USER_HOME和 idea 的 Gradle user home 设置成一致即可
IDEA 配置的 Gradle user home坑
gradlew命令:项目中Gradle Wrapper脚本文件,它会在没有安装Gradle的情况下为我们下载Gradle,之后我们就可以使用gradlew命令
如何 解决在Terminal中输入的gradlew的任何命令使用的gradle版本和IDEA中图形化操作使用的gradle版本是不一致的问题
IDEA中图形化操作使用idea 配置的gradle 版本,所有就不要在idea 里配置gradle 的版本,默认使用项目自带指定版本的gradle即可
**最常用的方式 **
依赖仓库 caches 和 各gradle版本位置
工程拆分与聚合
Gradle与Gradle Wrapper的区别
Gradle可以在没有安装Gradle的情况下使用,这时候就需要Gradle Wrapper了。Gradle Wrapper其实就是一个脚本文件,它会在没有安装Gradle的情况下为我们下载Gradle,之后我们就可以使用gradlew命令,像使用gradle一样来使用Gradle了。但是对于我们天朝用户来说,不管是Gradle还是Gradle Wrapper,都需要网络代理才能以较高的速度下载。
wrapper的意思:包装
那么可想而已,这是gradle包装。其实是这样的,因为gradle处于快速迭代阶段,经常发布新版本,如果我们的项目直接去引用,那么更改版本等会变得无比麻烦。而且每个项目又有可能用不一样的gradle版本,这样去手动配置每一个项目对应的gradle版本就会变得麻烦,gradle的引入本来就是想让大家构建项目变得轻松,如果这样的话,岂不是又增加了新的麻烦?所以android想到了包装,引入gradle-wrapper,通过读取配置文件(gradle-wrapper.properties)中gradle的版本,为每个项目自动的下载和配置gradle,就是这么简单。我们便不用关心如何去下载gradle,如何去配置进项目来。那么gradle wrapper从何而来?看下图
但是有人会疑问为什么直接执行gradle的命令,而是执行gradlew的命令?
因为就像wrapper本身的意义,gradle命令行也是善变的,所以wrapper对命令行也进行了一层封装,使用同一的gradlew命令,wrapper会自动去执行具体版本对应的gradle命令。。
那么gradle-wrapper.jar具体下载的gradle去哪了?
一般在用户目录下的C:/Users/hdd/.gradle/wrapper/dists存放 , GRADLE_USER_HOME 修改后为 D:/gradle-6.8.3/.gradle
创建Gradle Wrappr文件
使用gradle wrapper来创建一组Wrapper文件。Gradle官方建议我们在所有Gradle项目中都创建Wrapper文件,方便没有安装Gradle的用户使用。创建完毕之后,会发现我们的项目中多了如下一些文件:
gradlew (Unix Shell 脚本)
gradlew.bat (Windows批处理文件)
gradle/wrapper/gradle-wrapper.jar (Wrapper JAR文件)
gradle/wrapper/gradle-wrapper.properties (Wrapper属性文件)
然后,我们就可以像使用gradle命令一样使用gradlew了。
Gradle Wrapper会自动为我们下载合适的Gradle版本。
默认情况下,下载位置是$USER_HOME/.gradle/wrapper/dists,如果设置了GRADLE_USER_HOME环境变量,那么就会下载到GRADLE_USER_HOME/wrapper/dists下。
设置Wrapper版本
使用gradle wrapper --gradle-version 3.2.1来设置Wrapper的版本。或者也可以直接编辑gradle/wrapper/gradle-wrapper.properties文件来修改版本。
文件内容如下,可以编辑最后面的gradle-3.3-all.zip来配置版本。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
然后使用gradlew -v来查看变更之后的版本。每次更改版本,都会下载对应版本的Gradle文件。不过只需要下载一次,之后再次使用相同的版本就不会下载了。
gradlew常用命令
gradlew -v 版本号
gradlew clean 清除工程目录下的build文件夹
gradlew build 检查依赖并编译打包