前面完成手动挡的普通Java项目构建,本篇来介绍自动挡的项目构建工具如何帮助我们提供项目开发构建效率,为啥选择gradle,因为它在项目构建上自由度很大,而且有动态脚本语言的加持,更为我们后面基于gradle构建spring boot3.0项目的学习打个基础。
gradle全局配置
gradle软件无需手动安装,可以交给gradle项目脚手架工程源码中自带的gradle-wrapper
这个软件管家帮助我们全权代理。我们只需要告诉这个管家,本地的gradle缓存路径,以及做一些全局设置即可。
打开命令终端,比如我在路径D:\Programs\Gradle
下执行mkdir .gradle
来创建一个gradle本地缓存目录,并将路径D:\Programs\Gradle.gradle
添加到环境变量GRADLE_USER_HOME
。这样gradle管家就知道基于这个环境变量来找到本地缓存位置了。
然后在.gradle
目录下放两个配置文件:gradle.properties
和init.gradle
。前者代表gradle软件本身的设置,后者则是gradle项目构建脚本中的全局设置。
gradle.properties
properties
# 设置gradle工作时的最大堆内存
org.gradle.jvmargs=-Xmx2048M
# 可选配置:all,none,summary,用来设置gradle构建时控制台输出警告信息的模式
# all:打印所有警告信息,summary:只打印概要信息,none为不输出警告信息
# 因为gradle版本迭代很频繁,语法兼容性做的不太好,默认会输出很多警告信息,并不是构建失败,为了不被扰乱视听,这里设置为none,把不兼容的警告信息屏蔽掉。
org.gradle.warning.mode=none
init.gradle
groovy
allprojects {
// 项目中依赖和基本插件的下载仓库定义,注意访问顺序
repositories {
mavenLocal()
// 配置国内阿里仓库以加速访问
maven{ url 'https://maven.aliyun.com/repository/public'}
maven{ url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven{ url 'https://maven.aliyun.com/repository/spring'}
maven{ url 'https://maven.aliyun.com/repository/spring-plugin'}
mavenCentral()
}
// 在使用一些第三方插件、编写任务构建脚本和引入第三方类库时,对构建脚本中需要用到的仓库定义会全局生效
buildscript {
repositories {
mavenLocal()
maven{ url 'https://maven.aliyun.com/repository/public'}
maven{ url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven{ url 'https://maven.aliyun.com/repository/spring'}
maven{ url 'https://maven.aliyun.com/repository/spring-plugin'}
mavenCentral()
}
}
}
创建gradle类型的java工程
在配置好了环境变量GRADLE_USER_HOME
后,记得重启idea,然后先New Project:
这里我们选择基于groovy
脚本语言的gradle设置,gradle软件选择交给Wrapper管家帮我们自动管理,点创建。
在打开的工程界面下面,看到wrapper管家自动为我们下载软件,我这边网络很慢:
为此,我点了取消,转而设置下国内腾讯的软件源,进行以加速下载:
gradle/wrapper/gradle-wrapper.properties
properties
# 改成腾讯软件源
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.2-bin.zip
刷新gradle设置
然后发现很快就下载好了:
接下来的所有构建都由wrapper管家操作gradle帮我们代劳了,构建成功:
从控制台的输出,看到确实从我们全局配置的阿里云仓库地址下载构件了。
可能因为我之前取消的原因,src目录并没有创建出来,手动加下,项目上右键New -> Directory,这里会自动为我们展示沿用maven约定优于配置的那套结构:
看下项目结构:
这里的gradle-wrapper.properties
文件中指定了要告诉管家从哪里下载gradle软件版本以及缓存到本地哪个路径下的相关配置。
认识gradle配置文件
抛开junit平台的整合,我们看下gradle项目构建的脚本文件最简单的结构:
build.gradle
groovy
plugins {
id 'java'
}
group = 'com.javaxiaojuan'
version = '1.0-SNAPSHOT'
//repositories {
// mavenCentral()
//}
dependencies {
// testImplementation platform('org.junit:junit-bom:5.9.1')
// testImplementation 'org.junit.jupiter:junit-jupiter'
}
//test {
// useJUnitPlatform()
//}
gradle执行各种构建任务的核心就是插件,对Java项目,其核心自然就是java插件。插件的声明方式:
groovy
plugins {
id 'java'
}
这里我们选择的gradle构建脚本为groovy
,这是Java语言的超集,它还提供了动态语言的去强类型化 的特性,并且为参数的声明提供了闭包的机制,将声明与执行分开,这些在后续我们会一点点学习,这里先了解下{ ... }
声明语法是闭包的实现方式。
对于一个构建的产物(我们叫工件),它在发布的仓库里有一个唯一的坐标,引用方式为group:artifact:version
。这个结构在后面引入依赖时会讲。这里我们通过对gradle核心模块提供的内置变量的赋值,可以完成其声明:
groovy
group = 'com.javaxiaojuan'
version = '1.0-SNAPSHOT'
而坐标的artifact正是我们的项目模块名,对于单模块就同项目名,见settings.gradle
groovy
rootProject.name = 'watermark'
接下来,注释掉的部分中,仓库的定义在项目级别可以不指定,而采用全局设置的。java
插件给我们提供了junit
测试框架整合的能力,暂时我们不需要,先注释掉。
构建管理工具最显而易见的特性就是提供了依赖管理的能力,对于gradle来说,我们只需要在dependencies { ... }
中引入我们需要的依赖即可。这里的引入方式需要注意两个点:
-
依赖引入类型
官方的话叫做依赖配置类型,它决定了引入的依赖存在于哪个或者哪些类路径上。类路径这里分为4种:
- compileClasspath
- runtimeClasspath
- testCompileClasspath
- testRuntimeClasspath
单元测试环境涉及的是后两种,我们先不管。我们开发功能代码后的编译会对存在于编译类路径上引入的类库代码进行编译,运行期则是找存在于运行时类路径上的jar文件进行载入。
决定依赖被引入时存在的类路径范围的是,我们采用何种依赖配置类型来引入。对Java项目而言,
java
插件提供了内置的依赖类型,这里我们暂时不展开介绍,我们会使用implementation
这种配置类型,它引入的依赖在4种类路径上都会存在。 -
坐标的形式
不同于maven中
pom.xml
中声明依赖的臃肿形式,gradle提供更加简洁的坐标定义方式:group:artifact:version
,如果我们采用了依赖管理插件来管理预定义的依赖版本,则version
部分可以省略。
引入依赖
回到我们的项目,需要引入两个依赖,我们可以从maven仓库官方地址搜索到:
选择要引入的版本,点进去
拷贝内容:
以同样的方式引入commons-io
,加到项目build.gradle
的dependencies { ... }
配置中:
groovy
dependencies {
implementation 'com.madgag:animated-gif-lib:1.4'
implementation 'commons-io:commons-io:2.15.1'
}
更新了gradle配置后,点击如下的小图标(点一个即可)完成gradle项目的刷新。在当前脚本文件被更新后,会自动在编辑区右上角出现小象图标,以方便用户点击刷新:
刷新后,留意下Build控制台输出的信息,看是否构建成功。
拷贝工程代码
将上一篇中项目的src
源码拷贝进来
运行main
方法,后看到的输出,显而易见,这是gradle运行构建任务的执行结果
gradle的java
插件为我们提供了这么多的任务:
build下是项目基础构建相关的任务,流程更完善些,other下的任务相对独立一些。
jar包发布和运行
gradle可以借助java
插件对内置的jar
做一些设置来实现构建可执行jar的目标。
build.gradle中加一段jar
任务的配置:
groovy
jar {
// 打包依赖的jar包
from {
configurations.runtimeClasspath.collect { zipTree(it) }
}
manifest {
// 指定启动类
attributes 'Main-Class': 'com.javaxiaojuan.java.tools.watermark.Main'
}
}
刷新配置后,双击gradle工具箱中的jar任务,执行后看到:
注册一个执行java文件的任务,来实现对指定可运行jar包的执行,并传入参数列表:
groovy
tasks.register('runWatermarkJar', JavaExec) {
// 指定jar包相对于项目的路径
classpath = files('build/libs/watermark-1.0-SNAPSHOT.jar')
// 指定参数列表,多个参数之间用空格分开
args 'E:/java_juan/gradle/note/02/imgs E:/java_juan/gradle/note/02/imgs-watermark 2'
}
刷新gradle后,看到other分组中多了一个自定义任务,双击执行:
执行ok:
至此,我们通过使用gradle构建管理工具来完成普通Java工程构建的实践就到此结束了。通过实践我们发现,使用构建工具后,项目的依赖有构建工具帮我们管理了,同时它还提供了内置的各种任务帮我们完成项目的构建、打包和执行,只需要我们在构建脚本文件中做一些配置和定制即可,非常的方便,后续这种便利性在我们构建多模块的spring boot&cloud应用时,尤其能感受到gradle带来的美好体验。下一篇,咱们将一起学习实践gradle构建背后的一种弱类型语言------groovy
,同样我们会进行实操,把我们的工程代码用groovy
来改造,并试着将main
方法的启动方式做成gradle插件的形式,大家加油!!!