第一章:Gradle 插件简介

1.1 概述

  • 所有的 Gradle 项目中都存在有 Gradle Plugin 的定义,不同的 Gradle 插件可以帮助开发者实现不同的开发功能,例如:在之前创建的 Java 项目和 WEB 项目中都有 Gradle Plugin 的定义:
  1. plugins {
  2. id 'java' // 配置的是一个 Java 插件(Java 项目)
  3. id 'java-library'
  4. }
  1. plugins {
  2. id 'java' // 配置的是一个 Java 插件(Java 项目)
  3. id 'java-library'
  4. id 'war'
  5. }
  • 这两个插件可以帮助开发者创建相应的 *.jar*.war 打包文件,同时对于插件的引用,在之前讲解的子模块定义中实际上还提供有另外的一种语法:
  1. allprojects { // 所有模块/项目的通用配置
  2. apply plugin: 'idea'
  3. apply plugin: 'java' // 如果要想让 JDK 版本配置生效,必须要导入此插件
  4. apply plugin: 'java-library'
  5. }
  • 如果在配置父子项目的时候,没有在父项目中明确的写如上的配置,那么很多的配置将会失效,所有的插件其内部都会带有一些特定配置以及操作的选项。
  • Gradle 的常用插件:

1.png

  • 随着 Gradle 版本的不断提升,以上所给出的一些插件就可能不能够在新版本的 Gradle 中使用了。
  • 在 Gradle 的插件中提供有 PMD 的插件,其作用是为工程添加了 PMD 质量检测,PMD 是一种开源分析 Java 代码错误的工具,它是通过静态分析获取代码错误的。

1.2 插件引用

  • 如果要想在项目中使用 PMD 插件,那么一定要在 build.gradle 配置文件中对插件进行引用配置:
  1. plugins {
  2. id 'java' // 配置的是一个 Java 插件(Java 项目)
  3. id 'java-library'
  4. id 'pmd' // 项目中已经具备了代码检测的能力
  5. id 'maven-publish' // 必须配置 maven-publish 插件
  6. }

1.3 代码不标准

  • 代码的检测,实际上和开发工具内部的检测是非常相似的,如:有些变量可能仅仅定义了但是没有使用,所以可以考虑修改 MessageServiceImpl 程序:
  1. package com.github.fairy.era.service.impl;
  2. import com.github.fairy.era.service.IMessageService;
  3. /**
  4. * @author 许大仙
  5. * @version 1.0
  6. * @since 2021-12-21 08:42
  7. */
  8. public class MessageServiceImpl implements IMessageService {
  9. @Override
  10. public String echo(String msg) {
  11. int num = 10;
  12. String userName = "许大仙";
  13. return "hello " + msg;
  14. }
  15. }
  • 此时,程序中的 num 和 userName 变量完全没有使用过,所以理论上这两个变量不符合开发的要求。

1.4 执行检测

  • 通过 Gradle 的命令进行一下当前代码的检测操作。
  • 程序执行命令:
  1. gradle check
  • 程序执行结果:
  1. Execution failed for task ':pmdMain'.
  2. > 2 PMD rule violations were found. See the report at: file:///D:/project/gradle-01/build/reports/pmd/main.html
  3. * Try:
  4. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
  • 此时的 PMD 插件已经检测出问题了,同时也给出了检测报告,让我们访问 file:///D:/project/gradle-01/build/reports/pmd/main.html 这个文件。

2.png

  • 所有的插件直接在 plugins 之中配置即可,每当插件配置完成后就会出现新的任务以及新的各种支持。

第二章:gretty 插件

2.1 概述

  • 很多的 WEB 项目如果开发完成后一般都会选择在 Tomcat、WebLogic 或 WebSphere 等专属的容器上运行,但是也有一些开发者希望程序可以直接独立运行,例如:SpringBoot 打包之后就自带有 WEB 容器,所以 Gradle 中就提供了一个 gretty 的插件,这个插件打包后可以直接独立运行 WEB 程序。

2.2 插件引用

  • 在 WEB 项目的 build.gradle 配置文件中进行 gretty 插件的引用:
  1. plugins {
  2. id 'war' // 配置的是一个Web插件(Web项目)
  3. id 'java' // 配置的是一个Java插件(Java项目)
  4. id 'org.gretty' version '3.0.3' // 配置 gretty 插件
  5. }
  • 需要注意的是,如果直接在项目中直接去引用 org.gretty 插件可能会出现如下的错误信息:
  1. Build file 'D:\project\gradle-02\build.gradle' line: 4
  2. Plugin [id: 'org.gretty'] was not found in any of the following sources:
  3. * Try:
  4. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

2.3 更换仓库

  • 如果要想在项目中去使用 gretty 插件,还需要进行项目仓库的更换,修改 build.gradle 配置文件:
  1. repositories { // 仓库配置
  2. maven {
  3. url 'https://maven.aliyun.com/repository/public'
  4. }
  5. mavenCentral()
  6. }

2.4 依赖配置

  • 因为 servlet 等使用的是 compileOnly 范围,所以还需要进行 canBeResolved 的配置:
  1. plugins {
  2. id 'war' // 配置的是一个Web插件(Web项目)
  3. id 'java' // 配置的是一个Java插件(Java项目)
  4. id 'org.gretty' version '3.0.3' // 配置 gretty 插件
  5. }
  6. group 'com.github.fairy.era' // 组织名称
  7. version '1.0' // 版本号
  8. sourceCompatibility = 1.8 // 源代码版本
  9. repositories { // 仓库配置
  10. maven {
  11. url 'https://maven.aliyun.com/repository/public'
  12. }
  13. mavenCentral()
  14. }
  15. configurations { // 进行依赖的配置
  16. implementation {
  17. canBeConsumed = true
  18. canBeResolved = true
  19. }
  20. compileOnly{
  21. canBeConsumed = true
  22. canBeResolved = true
  23. }
  24. }
  25. dependencies { // 依赖管理
  26. testImplementation group: 'junit', name: 'junit', version: '4.13.2' // junit 4.x
  27. compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1' // servlet
  28. compileOnly group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '2.3.3' // jsp
  29. }
  30. tasks.withType(JavaCompile) { // 针对程序编译的任务进行配置
  31. options.encoding = "UTF-8"
  32. }
  33. war {
  34. archiveFileName = "${project.group}-${project.name}-${project.version}.war" // 手工设置 war 文件的名称
  35. }

2.4 Gradle 任务

  • 所有的插件配置完成之后都可以在项目中添加相应的任务,所以本次直接对当前的 WEB 程序打包。
  • 程序执行命令:
  1. gradle clean buildProduct
  • 程序执行结果:
  1. 16:19:11: 正在执行 'buildProduct'
  2. > Task :compileJava
  3. > Task :processResources NO-SOURCE
  4. > Task :classes
  5. > Task :war
  6. > Task :assemble
  7. > Task :compileTestJava NO-SOURCE
  8. > Task :processTestResources NO-SOURCE
  9. > Task :testClasses UP-TO-DATE
  10. > Task :test NO-SOURCE
  11. > Task :check UP-TO-DATE
  12. > Task :build
  13. > Task :buildProduct
  14. BUILD SUCCESSFUL in 18s
  15. 3 actionable tasks: 3 executed
  16. 16:19:29: 执行完成 'buildProduct'

2.5 程序执行

  • 当程序通过 gretty 插件打包完成之后会在 build/out 目录下存在有一组程序文件。

3.png

  • windows 平台上执行 start.bat ,Linux 平台上执行 start.sh 。

4.png

2.6 浏览器访问

5.png

2.7 容器配置

  • 在打包生成的 conf 目录下保存有配置文件,我们可以修改此配置文件实现端口的变更:
  1. {
  2. "productName": "gradle-02",
  3. "servletContainer": {
  4. "id": "jetty9.4",
  5. "version": "9.4.24.v20191120",
  6. "description": "Jetty 9.4.24.v20191120"
  7. },
  8. "serverConfig": {
  9. "port": 80
  10. },
  11. "webApps": [
  12. {
  13. "contextPath": "/gradle-02",
  14. "resourceBase": "webapps/com.github.fairy.era-gradle-02-1.0.war"
  15. }
  16. ]
  17. }

6.png

  • greety 插件本质上就是一个 jetty 容器,早期版本的 Gradle 可以直接使用 jetty 插件,但是目前来说,已经过期了。

第三章:distribution 插件

3.1 概述

  • 当项目开发完成之后肯定需要进行项目的打包发布,在之前进行项目发布的时候,常规的做法就是将所有的程序打包为 *.jar*.war 文件,可是有的时候,需要打包的文件是 *.zip*.tar.gz 程序包,这个时候就可以考虑使用 distribution 插件来帮助我们解决这些问题。

3.2 传统打包

  • 在之前一个使用了 gretty 插件的项目,这个项目可以将所有的 WEB 程序直接打包成一个独立运行的 jetty 程序,但是之前打包完成之后得到的文件全部都是分散性的文件,现在需要将其打包为 *.tar.gz 的压缩包。

7.png

3.3 插件配置

  • 修改 build.gradle 配置文件,在这个配置文件中引入 distribution 插件:
  1. plugins {
  2. id 'war' // 配置的是一个Web插件(Web项目)
  3. id 'java' // 配置的是一个Java插件(Java项目)
  4. id 'org.gretty' version '3.0.3' // 配置 gretty 插件
  5. id 'distribution' // 配置 distribution 插件
  6. }

3.4 打包配置

  • 如果要想进行打包,肯定要生成一个最终的包文件名称,同时还需要设置好所有的输入路径,此时的输入路径为:项目目录/build/output/gradle-02 ,修改 build.gradle 配置文件:
  1. distributions { // 定义打包的配置任务
  2. main { // 定义相关的文件属性
  3. distributionBaseName = 'gradle-02' // 生成的文件名称
  4. contents { // 确定所有要打包的文件来源
  5. from { "${buildDir}/output/gradle-02" }
  6. }
  7. }
  8. }

3.5 打包类型

  • 本次将程序包打包为 *.tar.gz 文件类型,所以还需要进行一些配置,修改 build.gradle 配置文件:
  1. plugins.withType(DistributionPlugin) {
  2. distTar {
  3. compression = Compression.GZIP // 打包类型
  4. archiveExtension = 'tar.gz' // 设置文件后缀
  5. }
  6. }

3.6 打包任务

  • 定义相应的打包任务,修改 build.gradle 配置文件:
  1. task buildTar(dependsOn: distTar) {
  2. description = '自定义打包任务'
  3. }

3.7 打包操作

  • 程序执行命令:
  1. gradle clean buildProduct
  1. gradle buildTar
  • 程序执行结果:

8.png

第四章:checkstyle 插件

4.1 概述

  • checkstyle 是一款源代码规范化检测的开发插件,如果需要学习 checkstyle 之中的各种规范化的检测配置语法,可以登录其官网

4.2 IDEA 代码标准

  • 如果要想使用 checkstyle ,那么一定需要有一个完善的 XML 配置文件,在 IDEA 中并没有直接提供此配置文件,需要单独配置,该文件名为 intellij-java-google-style.xml intellij-java-google-style.zip ,只需要打开 IDEA 中的 配置界面即可进行配置。

9.png

10.png

11.png

12.png

4.3 checkstyle 配置

  • 在项目中定义有一个 config 目录 checkstyle.zip,同时将所有和 checkstyle 相关的规范化配置文件进行定义。

13.png

4.4 插件引入

  • 修改 build.gradle 配置文件,在项目中导入 checkstyle 插件:
  1. plugins {
  2. id 'war' // 配置的是一个Web插件(Web项目)
  3. id 'java' // 配置的是一个Java插件(Java项目)
  4. id 'idea'
  5. id 'org.gretty' version '3.0.3' // 配置 gretty 插件
  6. id 'distribution' // 配置 distribution 插件
  7. id 'checkstyle'
  8. }

4.5 checkstyle 配置

  • 修改 build.gradle 配置文件,进行 checkstyle 的相关定义:
  1. checkstyle { // 进行 checkstyle 的相关配置
  2. sourceSets = [sourceSets.main] // 对源代码进行代码检测
  3. configFile = rootProject.file('config/checkstyle/checkstyle.xml') // 定义配置文件的位置
  4. showViolations = true // 显示所有的违规行为
  5. ignoreFailures = true // 忽略所有的失败
  6. }

4.6 测试配置

  • 既然是进行代码的检测,那么相关的代码测试就可以忽略了,修改 build.gradle 配置文件:
  1. checkstyleTest { // 代码测试的配置
  2. enabled = false // 不执行测试
  3. }

4.7 checkstyle 任务配置

  • 最终 checkstyle 一定会生成相关的检测报告,那么可以配置这个报告的名称和路径,修改 build.gradle 配置文件:
  1. tasks.withType(Checkstyle) {
  2. reports {
  3. html.outputLocation.fileValue(rootProject.file('build/reports/checkstyle.html'))
  4. }
  5. }

4.8 Gradle 代码检测

  • 直接通过 gradle 的命令对当前项目中的代码进行检测。
  • 程序执行命令:
  1. gradle clean check
  • 程序执行结果:
  1. > Task :clean
  2. > Task :compileJava
  3. > Task :processResources NO-SOURCE
  4. > Task :classes
  5. > Task :checkstyleMain
  6. [ant:checkstyle] [ERROR] D:\project\gradle-02\src\main\java\com\github\fairy\era\servlet\HelloServlet.java:1: 文件未以空行结尾。 [NewlineAtEndOfFile]
  7. Checkstyle rule violations were found. See the report at: file:///D:/project/gradle-02/build/reports/checkstyle.html
  8. Checkstyle files with violations: 1
  9. Checkstyle violations by severity: [error:1]
  10. > Task :compileTestJava NO-SOURCE
  11. > Task :processTestResources NO-SOURCE
  12. > Task :testClasses UP-TO-DATE
  13. > Task :test NO-SOURCE
  14. > Task :check
  15. BUILD SUCCESSFUL in 709ms
  16. 3 actionable tasks: 3 executed
  17. 10:23:59: 执行完成 'clean check'