gradle
gradle是一种新的构建项目工具,他和maven、Ant一样,并且集合了他们的优点。它是由google公司基于jvm编写的。Gradle 正迅速成为许多开源项目和前沿企业构建系统的选择,同时也在挑战遗留的自动化构建项目。
Gradle的特点:
高性能
基于jvm
约束:跟maven一样,有自己的项目结构
可扩展:可以diy
安装
我们要来使用gradle,首先就要安装。我们可以前往gradle官网进行安装。这里需要知道,gradle官网并且写出需要jdk1.8或者更高的版本!
如果你家电脑网速不好,可以使用腾讯云的镜像进行下载。
下载完成后,将他解压到你想存放的位置,然后进行环境变量的配置,就跟java一样,在path里面写上gradle_home并将他的文件夹目录粘贴到上面即可。
然后进入命令行 gradle -v来看看是否安装成功。
目录结构
build:封装编译后的内容
gradle:封装包装器
src:写代码的地方
build.gradle:构建脚本
settings.gradle:配置文件
创建项目
idea上面自带的创建,或者使用命令行 grade init进行创建。在创建项目时候,她会问你使用什么格式来进行配置文件创建,kotlin,或者groovy进行dsl配置。
分别是
1.生成项目类型
2.使用语言
3.dsl配置使用语言
4.test框架
5.项目名称
6.包名称
7.jdk版本
8.是否使用api
常用指令
gradle clean:清空build目录
gradle classes:编译业务代码和配置文件
gradle test:编译测试代码,test目录中内容,生成测试报告
gradle build:构建项目,会先执行classes,test命令
gradle build -x test:跳过测试进行构建
执行上面的指令后,结果会出现在app目录的build中,classes指令会生成java代码的class文件,test指令会将test文件夹内容进行执行,并且在build文件夹中生成reports目录。
修改下载源
我们知道他和maven一样,对于我们国内下载外面的内容是十分慢的,所以我们要重新配置他的下载源。那如何更改呢?
首先来到init.d目录
我们可以在这个文件夹中写一些脚本,每次的执行都会运行这个文件夹里面的脚本。
我们在这个文件夹中创建init.gradle文件,并且写入
allprojects{
repositories {
def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public'
def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/public'
def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin'
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
}
if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
remove repo
}
if (url.startsWith('https://plugins.gradle.org/m2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
remove repo
}
}
}
maven { url ALIYUN_REPOSITORY_URL }
maven { url ALIYUN_JCENTER_URL }
maven { url ALIYUN_GOOGLE_URL }
maven { url ALIYUN_GRADLE_PLUGIN_URL }
}
}
配置完成后,重新使用gradle classes进行试验,发现速度快得多了。
wrapper
gradle的wrapper是对gradle的一层封装,为了解决实际开发中可能遇到不同项目不同版本的gradle,这时候我们就要考虑使用gradle wrapper了,拥有这玩意,我们本地就不需要在设置gradle了。
使用
如何去使用wrapper呢,在创建出来的项目中有gradlew.bat和gradlew,点开gradlew可以看到配置。
意思是指定当前项目目录的gradle文件夹wrapper目录下的jar包。
我们可以在命令行使用gradlew指令,调用的其实就是gradlew.bat 加上我们想使用的命令。在这里有一点就是wrapper的版本和本地的版本会不一样。这个很正常,不然为什么要使用wrapper呢。
我们也可以指定这个版本的生成。
指令 | 内容 |
---|---|
gradle wrapper --gradle-version=版本号 | 指定版本 |
gradle [wrapper] --gradle-distribution-url=地址 | 指定下载地址 |
配置
gradlewrapper的配置信息全部保存在项目目录的gradle下wrapper目录的wrapper.properties里面。
里面包含wrapper保存位置,下载位置,gradle的版本号,解压位置等等。
执行流程
1.当我们执行gradlew bulid时,他会去properties中配置的url进行下载gradle包,并且保存在GRADLE_USER_HOME/wrapper/dist中。
2.然后解压到同样的位置。
3.将解压内容同时放到GRADLE_USER_HOME/caches中进行缓存,下次使用就不需要重新下载了。
总结
这里也很清晰了,当我们使用别人的项目时候,通过项目使用gradle,如果是我们本地项目,那当然使用本地gradle了。
groovy
groovy是java的一种脚本化改良版,groovy也是运行在jvm上,可以很好地与java代码进行交互,是一种成熟的面向对象编程语言。相比于java使用groovy可以更少的内容完成工程。
特点
1.提供动态类型转换、闭包、元编程(metaprogramming)支持
2.支持函数式编程,不需要main函数
3.默认导入常用包
4.类不支持default,且默认作用域为public
5.groovy也是对象,可以直接调用对象方法
6.支持dsl(domain specific language)和其他简洁的语法,让带吗变得易于阅读和维护。
安装
官网安装,配置环境变量,groovy -v看是否安装成功。
基本语法
1.基于java代码,所以兼容java代码,既可以当脚本语言,也可以当做类【对象】使用。
2.在groovy文件中可以混合类的定义和脚本定义。但名不能相同。
3.groovy中简化了对于变量和方法的具体数据类型定义,使用def来定义,不建议使用具体数据类型。
4.groovy的语法末尾可以不使用结尾符,跟python一样。
5.类 方法 字段都是默认public,而java是default。
6.groovy会为变量 或者属性生成getter,setter方法
6.方法声明时,参数类型,返回值类型,return关键字可以省略,方法调用时,会默认选择最后一个输出当做return返回。在不影响歧义的地方,可以省略方法的括号。
7.对象属性赋值:
对象.属性名=
对象[“属性名”]
对象.setter()
具体构造器
8.对象get方法
对象.属性
对象[属性名]
对象.getter
9.字符串
单引号 ‘ ’ 不支持变量引用,不支持换行操作
双引号 “ ” 支持变量引用,不支持换行操作 ${desc}
三引号 ‘’’ 不支持变量引用,支持换行操作。
只有第二个是groovy的封装。
10.闭包
一串代码块,可以放到一个地方执行。
gradle创建web项目
如果你要使用gradle创建java web项目,你需要war插件,war是一种运行web项目的包。
在下图位置添加war插件,这个意思是添加创建war包的task任务。
你写上这个后,可以在右边task中看到。
也可以使用apply,不过现在已经不怎么样了,这里不细讲。
经过这样的操作,当你运行gradle的build后,就会在build文件夹的libs下面生成两个war包,一个是exploded一个是普通的。
(1)war模式这种可以称之为是发布模式,看名字也知道,这是先打成war包,再发布;
(2)war exploded模式是直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。
plugin也可以放其他很多插件,具体可以看他的社区。
测试
gradle项目在执行build后会将test目录下的内容全部执行一遍,并且在report目录下生成报告。他支持Junit和TestNG测试。
首先在环境中写上使用测试工具版本。
然后在下面的test内容中写上useJunitPlatform()
这里我使用的是junit5
junit5
testImplementation platform('org.junit:junit-bom:5.9.1')
testImplementation 'org.junit.jupiter:junit-jupiter'
test{
use JUnitPlatform()
}
junit4
testImplementation('junit:junit:4.13')
test{
use Junit()
}
简单的操作
还有一些简单的操作我就放到这个图里面了。
gradle的生命周期
gradle的生命周期分为三大阶段:Initialization Configuration Execution。
init
1.初始化 init.gradle
2.执行项目的settings.gradle(记录当前项目的项目名和子项目名)
configure
1.执行本项目的build.gradle进行生成task任务(根据层级结构加载,首先是allProject,其次是plugins和dependency)
execute
执行configure构造的task任务树
settings文件
settings文件是用来确认项目的层级结构的,为之后构建项目工程树做准备。他类似于maven中的project和module。
rootproject->subproject
我在这里创建了两个module,他就会在settings文件中显示出来。
include实际上是settings类的方法,他的括号是groovy省略了。
include实际放入的就是我们rootProject下面的子项目。他是基于相对路径的。
dependency
bulid.gradle中的dependencies是project类的方法。他里面是放了一个闭包,所以省略的圆括号直接使用了宽括号。
依赖方式
1.本地依赖:一个文件夹下面有需要的依赖
2.项目依赖:一个项目依靠另一个项目
3.直接依赖:直接导入依赖
依赖冲突
gradle会优先选择版本更高的jar包,1.4和1.6选择1.6 。
你也可以使用参数exclude来排除一些依赖。
implementation ('mysql:mysql-connector-java:8.0.33'){
exclude(group:'org.sl4f.jar`')
}
不允许使用依赖传递
implementation ('mysql:mysql-connector-java:8.0.33'){
exclude(group:'org.sl4f.jar`')
transitive(false)
}
强制使用某个版本号
implementation ('mysql:mysql-connector-java:8.0.33'){
version {
strictly('1.4')}
}
可以配置当遇到依赖冲突,就立即构建失败
configurations .configureEach(){
Configuration configuration->
configuration.resolutionStrategy .failOnVersionConflict()
}
gradle创建springboot项目
plugins{
id 'java'
id 'war'
//下面两个是管理springboot的依赖包的,就跟maven的dependencyManagement一样
id 'org.springframework.boot' version '2.3.7.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
}
dependencies{
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.mysql:mysql-connector-j'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
然后就可以使用了。
一定要注意版本问题。