基于gradle的工程化实践之路(二)

前一篇:基于gradle的工程化实践之路(一)

前面完成手动挡的普通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.propertiesinit.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.gradledependencies { ... }配置中:

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插件的形式,大家加油!!!

相关推荐
啊松同学几秒前
【Redis】缓存击穿与缓存雪崩:问题与解决方案
java·数据库·redis·后端·缓存
hummhumm3 分钟前
Oracle 第23章:大数据与NoSQL集成
java·大数据·数据库·hive·python·oracle·nosql
AI人H哥会Java8 分钟前
【JAVA】Java基础—面向对象编程:类与对象-创建一个Person类的练习示例
java·开发语言
楠寻寻9 分钟前
SpringBoot中的注解详解(一)
java·spring boot·后端·spring·注解
说书客啊12 分钟前
计算机毕业设计 | SpringBoot智慧⾼校学术报告系统 AI写作大模型生成平台(附源码)
java·数据库·spring boot·后端·毕业设计·课程设计·ai写作
.又是新的一天.22 分钟前
关于IDEA单元测试控制台不能输入数据的问题解决办法
java·ide·intellij-idea
Xwzzz_33 分钟前
ThreadLocal 的概念及使用场景(登录状态验证)
java·开发语言·spring boot
whp4042 小时前
springboot静态资源映射不生效问题
java·spring boot·后端
一丝晨光2 小时前
Objective-C 1.0和2.0有什么区别?
java·开发语言·macos·c#·objective-c·swift·apple
Kika写代码2 小时前
【基于轻量型架构的WEB开发】课程 作业4 AOP
java·前端·架构