一、Gradle介绍
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。
面向Java应用为主, 支持maven。和maven一样,都是当前热门的自动化构建工具。
优点:
-
一种可切换的,像maven一样的基于约定的构建框架,却又从不锁住你(约定优于配置)
-
强大的支持多工程的构建
-
强大的依赖管理(基于Apache Ivy),提供最大的便利去构建你的工程
-
全力支持已有的Maven或者Ivy仓库基础建设
-
支持传递性依赖管理,在不需要远程仓库和pom.xml和ivy配置文件的前提下
-
基于groovy脚本构建,其build脚本使用groovy语言编写
-
具有广泛的领域模型支持你的构建
二、Gradle的下载与安装
2.1Gradle下载
下载地址:https://docs.gradle.org/current/userguide/installation.html#installing_manually
选择版本,点击binar-only下载。
2.2Gradle安装
0.Gradle安装条件:jdk1.8及以上。
1.解压gradle-7.1-all.zip 到任意目录下
G:\gradle\gradle-7.1
2.配置环境变量
我的电脑->属性->高级->环境变量->新建系统变量
变量名:GRADLE_HOME
变量值:G:\gradle\gradle-7.1
如图:
添加 %GRADLE_HOME%\bin
到 Path 系统变量中 :
2.3修改Gradle本地仓库位置
由于没有办法像Maven一样配置Setting文件来修改本地库的位置,我们可以通过设置环境变量GRADLE_USER_HOME
的路径来改变gradle的本地仓库的位置。 gradle也是可以使用maven的仓库的 。
我的电脑->属性->高级->环境变量->新建系统变量
2.4Gradle安装完验证
运行cmd
,输入命令: gradle -v
显示如下表示成功。
三、创建gradle项目
1.新建Gradle项目
使用工具:idea+jdk8
新建项目->选择Gradle ->点击next->填写项目名->点击Finish
2.配置Gradle环境
刚创建完一个项目,默认使用wrapper下的gradle版本。
我们使用本机的gradle版本,如下idea配置:
点击File->setting->搜索gradle->修改配置如下
3.引入springboot插件
plugins {
id 'org.springframework.boot' version '2.3.7.RELEASE' //维护springboot版本号,不单独使用,和下面两个插件一起用
id 'io.spring.dependency-management' version '1.0.10.RELEASE' //进行依赖管理,在引入其它boot依赖时省略版本号、解决jar包冲突问题
id 'java' }
springframework:指定springboot的版本并依赖jar包
dependency-management :进行依赖的版本的管理;(以后引入相关依赖就无需写版本号)
4.引入相关依赖
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web' //省略版本,原生bom支持,插件management提供testImplementation('org.springframework.boot:spring-boot-starter-test')
}
test {useJUnitPlatform()
}
然后刷新gradle自动导入相关依赖。
5.创建controller层
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: shen
* @CreateTime: 2022-01-07 10:22
* @Description: controller层
*/
@RestController
@RequestMapping("/actor")
public class ActorController {
@GetMapping("/hi")
public String hi(){
return "nihao,xiaoshen";
}
}
6.创建springboot启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author: shen
* @CreateTime: 2022-01-07 10:25
* @Description: 启动类
*/
@SpringBootApplication
public class GradleApplication {
public static void main(String[] args) {
SpringApplication.run(GradleApplication.class,args);
}
}
7.启动Gradle项目
要想运行当前 Springboot 项目,直接执行 gradle bootRun 指令或者 idea 右侧按钮即可。
当然如果想让当前项目打成可执行 jar 包,只需执行: gradle bootJar 指令即可。
8.测试
测试:localhost:8080/actor/hi
jar包:
四、build.gradle详解
一个项目中只放置一个build.gradle, 指定依赖信息的配置中心。这个文件中的模块分为如下几个模块:
属性:
属性名 | 所属 | 说明 |
---|---|---|
group | project | |
version | project | 项目版本(全局的) |
name(artifact) | project | 一般写在settings.gradle |
sourceCompatibility = 1.8 | java插件 | |
targetCompatibility = 1.8 | java插件 | |
compileJava.options.encoding = ‘UTF-8’ | ||
compileTestJava.options.encoding = ‘UTF-8’ |
方法:
方法 | 说明 |
---|---|
apply | 应用 |
repositories | 添加仓库 |
dependencies | 添加依赖 |
buildscript | |
allprojects | |
subprojects | |
configurations |
1.group和version
本属性指定了本gradle工程所属的组和版本号 。
group 'org.example'
version '1.0-SNAPSHOT'
2.apply
apply plugin: 'java'
3.sourceCompatibility
本属性定义了源码语法使用的java级别。
sourceCompatibility = 1.8
4.repositories 方法
指定所使用的仓库 ,格式如下:
repositories{
mavenLocal() 优先从本地获取依赖
mavenCentral()
}
mavenCentral()
表示使用maven的中央仓库,此刻项目中所需要的jar报都会默认从中央仓库下载到本地指定目录中。
5.dependencies 方法
gradle工程中,所有的jar包坐标都在dependencies 属性中放置。每一个jar的坐标都有三个基本元素组成(groupId, name, version,类似于maven的坐标)。
dependencies {
//单个依赖
implementation group: 'com.alibaba', name: 'fastjson', version: '1.2.73'
//单个依赖简写
implementation 'com.alibaba:fastjson:1.2.73'
//多个依赖
implementation 'com.alibaba:fastjson:1.2.73', 'log4j:log4j:1.2.17'
//闭包依赖,为了添加额外配置
implementation("org.mybatis:mybatis:3.5.6"){
exclude group :"org.springframework",module:"spring"
exclude group :"org.javassist",module:"javassist"
exclude group :"org.jboss.netty",module:"netty"
}
//双引号方式使用变量,在ext中声明或 def 关键字声明变量 lombok_version=具体版本
annotationProcessor "org.projectlombok:lombok:$lombok_version"
compileOnly "org.projectlombok:lombok:${lombok_version}"
}
项 | 说明 |
---|---|
compile/testCompile //deprecatedimplementation/testImplementation | compile在3.x及之后依然能用。 |
compileOnly/testCompileOnly | 只在编译时有效,不会参与打包 |
compileClasspathtestCompileClasspath | 继承自:compile, compileOnly, implementation继承自:testCompile, testCompileOnly, testImplementation |
annotationProcessor | 使能注解处理器。比如:lombok就要到。 |
runtime/testRuntime //deprecatedruntimeOnly/testRuntimeOnly | 编译时不会参与,很少用 |
runtimeClasspathtestRuntimeClasspath | 继承自:runtimeOnly, runtime, implementation继承自:testRuntimeOnly, testRuntime, testImplementation |
archives | uploadArchives任务会用到 |
default | 继承自:runtimeClasspath |
6.buildscript{}
buildscript{}必须放在最上面, gradle在执行脚本时,会优先执行buildscript代码块中的内容,然后才会执行剩余的build脚本。
buildscript {
ext {
springBootVersion = '2.1.1.RELEASE'
lombokVersion = '1.18.10'
}
repositories {
...
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'abcd'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
ext['springCloudVersion'] = 'Greenwich.RC2'
dependencies {
//Spring Boot
compile('org.springframework.boot:spring-boot-starter')
//Spring MVC
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-aop')
compile("org.projectlombok:lombok:${lombokVersion}")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
五、项目问题
1.编译乱码处理
//在 build.gradle 增加以下配置
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
2.跳过测试编译
//在 build.gradle 增加以下配置
gradle.taskGraph.whenReady {
tasks.each { task ->
if (task.name.contains("test")) {
task.enabled = false
}
}
}
3. 发布私服
//在 build.gradle 增加以下配置
// 1.私服账号密码
buildscript {
ext {
nexusUsername = 'admin'
nexusPassword = '12345'
}
}
// 2.配置分组,版本号
group 'org.example'
version '1.0.0'
// 3.配置maven插件
plugins {
id 'maven'
}
//发布私服,包名为文件 settings.gradle 中 rootProject.name 配置的名称,版本为上文配置的 verison 版本号
uploadArchives {
repositories {
mavenDeployer {
//这里配置自己的私服地址
repository(url: "") {
authentication(userName: nexusUsername, password: nexusPassword)
}
//这里配置自己的私服地址
snapshotRepository(url: "") {
authentication(userName: nexusUsername, password: nexusPassword)
}
}
}
}
执行发布
方式1:使用命令在根目录下执行 > gradle uploadArchives
方式2:使用编译器右边的插件列表执行发布:upload
4. 发布本地
//在 build.gradle 增加以下配置
// 1.配置分组,版本号
group 'com.alone.demo'
version '0.0.1-SNAPSHOT'
// 3.配置maven插件
plugins {
id 'maven-publish'
}
//发布本地,包名为文件 settings.gradle 中 rootProject.name 配置的名称,版本为上文配置的 verison 版本号
publishing {
publications {
maven(MavenPublication) {
from(components.java)
}
}
}
使用idea右边插件列表执行发布:publishing
5. 依赖冲突
1.通过配置全局排除冲突包(全局封杀),如:
//方式一
configurations {
all{
exclude group :"org.springframework.boot",module:"spring-boot-starter-logging"
}
}
//方式二 简写
configurations.all*.exclude module: "spring-boot-starter-logging"
2.排除冲突的依赖,例如
dependencies {
implementation("org.mybatis:mybatis:3.5.6"){
exclude group :"org.springframework",module:"spring"
exclude group :"org.jboss.netty",module:"netty"
}
}
3.强制指定版本策略,即在发生冲突时使用指定的版本,如:
/冲突失败策略设置
configurations.all {
resolutionStrategy { failOnVersionConflict() }
}
//强制指定版本策略设置
dependencies {
//方式一 闭包
implementation ("io.netty:netty-all:4.0.44.Final"){
force true
}
//方式二 简写
implementation group: 'io.netty', name: 'netty-all', version: '4.0.44.Final', force: true
4.使用动态依赖
dependencies {
//方式一:指定某个版本以上,减小发生版本冲突的几率。如以下依赖选择 3 以上任意一个版本
implementation 'cn.afterturn:easypoi-base:3.+'
// 方式二:选择最新的版本
implementation 'cn.afterturn:easypoi-base:latest.integration'
}