操作系统:Win 11 。 ⭐表示重要。
第一章:Gradle 简介
1.1 什么是构建工具?
- 构建工具是一个将源代码生成可执行应用程序的过程自动化的程序,例如:Android 生成 apk ,Java 生成 jar 、war 等。
- 项目构建步骤:
- 下载依赖。
- 源代码编译成二进制代码。
- 打包生成二进制代码。
- 单元测试。
- 部署到生产系统。
- ……
- 在早期的开发过程中,由于一些组件有关联问题,例如:A 组件需要依赖 B 组件,B 组件需要依赖 C 组件,所以最早的时候如果想开发一个正确的程序,各种应用环境的配置是非常麻烦的,早期使用 MyEclipse 开发工具可以帮助我们解决大部分开发包的问题,但是随着 Maven 的流行,MyEclipse 的优势就一去不复返了(如果项目中的依赖升级到新版本之后,还要再次手动测试一遍,非常麻烦)。
- Apache Ant 是由 Java 语言开发的工具,由 Apache 软件基金会所提供。Apache Ant 的配置文件写成 XML 容易维护和书写,而且结构很清晰。
- Apache Maven 是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,所有的项目配置信息都被定义在 POM.xml 文件中,通过该文件 Maven 可以管理项目的整个周期。
- 在早期的时代(2000 年初)主要是通过 Ant 实现打包构建,其最大的特点是直接在本地实现仓库的管理,但是很多开发者不习惯使用 Ant(因为可以直接在 Eclipse 或 MyEclipse 中将依赖包配置到 CLASSPATH 中),但是后来有了 Maven 之后,由于 Maven 第一次提出了网络仓库的概念,同时也可以很轻松的控制依赖的版本,所以 Maven 很快就取代了 Ant 。
1.2 为什么要使用 Gradle ?
- 当代码编写完成之后肯定需要进行打包处理,随后才可以进行线上部署,在传统的开发过程中,最早使用的全部都是手动的方式进行配置的,但是随着技术的发展以及项目开发的规模日益庞大,所以很多开发者就开始在项目之中大量的使用构建工具,按照时代的发展,构建工具的发展过程:
Ant –> Maven –> Gradle
,实际上Gradle
的产生时间并不比Maven
短多少,但是其最早主要应用在 Android 系统开发上,而在传统的 Java 项目上更多使用的还是Maven
。 - 构建工具是所有项目开发中必定要使用到的技术,而
Maven
作为一款成熟的构建工具,虽然其使用方便,但是也存在一些缺点:- 所有的配置都是基于 XML 配置文件完成的(POM文件)。
- 整个的项目都需要进行整体的编译执行,如果想执行某些命令,那么也依然需要将整个项目进行处理。
- 如果是一个庞大的系统开发,那么除了有服务器端程序之外,一定还有大量的移动端程序,总不能说移动端使用
Gradle
构建,而 Java 服务器端的代码使用Maven
构建,虽然看起来没有什么问题,但是不同的开发工具在使用和管理上一定会存在问题,正是这个因素,所以国内Gradle
的使用范围已经开始越来越广(助力:Spring
项目的代码已经由Maven
移植到了Gradle
,按照技术的发展趋势,未来的发展Gradle
一定会慢慢成为主流)。
1.3 Gradle 是什么?
- Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建工具。
- Gradle 使用一种基于 Groovy 的特定领域语言来声明项目设置,而不是传统的 XML(现在也支持 Kotlin 了)。
- Maven 之中的配置文件(pom.xml)的内容由于需要按照 XML 方式进行定义,所以其语法是非常固定的,也就是说没有任何的动态发挥空间(仅仅提供了一个配置),而 Gradle 最大的特点是可以直接在配置文件中编写自己的程序逻辑,同时 Gradle 应用了 Apache 提供的 Groovy 开发语言进行编写,同时所有在 Gradle 之中配置的操作都是以『任务』的形式出现的,可以由开发者动态的进行各种任务的定义和任务的执行。
第二章:Windows 系统安装 Gradle(⭐)
2.1 Gradle 的官网
2.2 Gradle 的安装说明
- Gradle 是一个全平台支持的构建工具,所以可以在任何操作系统(Mac 、Linux 和 Windows)中进行安装和配置,本次将在 Windows 系统中进行 Gradle 工具的安装。
- Gradle 需要依赖于 Java 环境,所以要先配置 Java 环境(略,JDK 版本是 11 )。
2.3 Gradle 的安装和配置
- 解压 Gradle :
- 配置 GRADLE_HOME :
GRADLE_HOME
D:\develop\gradle-6.5
- 配置 Path 环境变量:
path
%GRADLE_HOME%\bin
2.4 测试 Gradle 是否安装成功
- 命令:
gradle -v
第三章:Gradle 的基本配置(⭐)
3.1 传统构建工具的使用的问题
- Gradle 现在已经安装成功了,但是按照传统构建工具的使用需要注意如下的问题:
- ① 新时代所有的构建工具一般都会通过网络仓库来进行第三方组件包的获取,Gradle 和 Maven 仓库的坐标的查询网站是同一个:中央仓库,如果要进行开发包的下载,那么需要使用国内的镜像(例如:阿里的 Maven 仓库镜像)。
- ② 配置本地化的缓存仓库路径,因为所有通过网络下载的开发包,都需要在本地某个目录下进行存储,默认情况下 Gradle 是直接保存在用户目录(C 盘下),但是考虑到长期的使用问题,还是建议在专属的磁盘中进行配置。
3.2 Gradle 的基本配置
3.2.1 本地存储
- 假设将所有的 Gradle 仓库的缓存(Maven 是直接下载开发包)保存在磁盘的以下路径之中:
D:\develop\gradle-6.5\repository
- 如果要想进行本地仓库的配置直接配置环境变量即可(不是去修改配置文件),追加一个环境变量(注意:如果你是 Administrator 管理员,就新建系统变量;否则,新建用户变量),配置的内容为:
GRADLE_USER_HOME=D:\develop\gradle-6.5\repository
3.2.2 更换镜像源
- 对于当前的 Gradle 来说,已经明确的设置了一个工作的主目录,所以需要修改镜像地址。
- 在
GRADLE_USER_HOME
环境变量对应的目录中新建一个init.gradle
的配置文件(Gradle 项目的全局配置文件),内容如下:
allprojects {
repositories {
def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/central'
def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/public'
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
}
}
}
maven {
url ALIYUN_REPOSITORY_URL
url ALIYUN_JCENTER_URL
}
}
}
第四章:IDEA 创建 Gradle 的 Java 项目(⭐)
4.1 概述
- 如果要想开发 Gradle/Maven 项目肯定要使用开发工具是最方便的,因为里面有一些项目的代码结构,那么如果说现在使用的是 Gradle 开发,首先建议一定要将 Gradle 工具做一些简单配置。
4.2 检查 IDEA 是否识别 Gradle 的环境变量
- 在之前进行 Gradle 配置的时候,配置了 Gradle 的缓存路径,里面也存在了一个
init.gradle
的配置文件,这个配置必须被 IDEA 工具识别,否则配置就失效了。
实现不行,就在
系统环境变量
和用户环境变量
中都配置Gradle_USER_HOME
。
4.3 创建空项目
4.4 创建 Java 项目
- IDEA 之中直接提供了 Gradle 项目的支持,所以直接利用新建项目的形式创建 Gradle 项目。
4.5 Gradle 的 Java 项目组成
.
|-- build.gradle # Gradle 的核心配置文件,和 Maven 中的 pom.xml 文件作用相当
|-- gradle # 保存有 GradleWrapper 相关配置
| `-- wrapper
| |-- gradle-wrapper.jar
| `-- gradle-wrapper.properties
|-- gradlew
|-- gradlew.bat
|-- settings.gradle
`-- src # 保存所有的程序源代码目录
|-- main # 保存程序代码
| `-- java
`-- test # 保存所有的测试程序代码
`-- java
- build.gradle详解:
plugins {
id 'java' // 配置的是一个 Java 插件(Java 项目)
}
group 'com.github.fairy.era' // 组织名称
version '1.0' // 项目版本
sourceCompatibility = 11 // 源代码版本
repositories { // 仓库配置
mavenCentral()
}
dependencies { // 依赖管理
testImplementation group: 'junit', name: 'junit', version: '4.13.2'
}
tasks.withType(JavaCompile){ // 针对程序编译的任务进行配置
options.encoding = "UTF-8"
}
4.6 创建 Java 源程序
- 在 src/main/java 目录下编写 Java 源代码:
- IMessageService.java
package com.github.fairy.era.service;
/**
* @author 许大仙
* @since 2021-12-19 22-26
*/
public interface IMessageService {
/**
* echo 方法
*
* @param msg
* @return
*/
String echo(String msg);
}
- MessageServiceImpl.java
package com.github.fairy.era.service.impl;
import com.github.fairy.era.service.IMessageService;
/**
* @author 许大仙
* @since 2021-12-19 22-31
*/
public class MessageServiceImpl implements IMessageService {
@Override
public String echo(String msg) {
return "hello " + msg;
}
}
4.7 编写 Junit 单元测试
- 在 src/test/java 目录下编写 Junit 单元测试:
- MessageServiceTest.java
package com.fairy.era.service;
import com.github.fairy.era.service.IMessageService;
import com.github.fairy.era.service.impl.MessageServiceImpl;
import org.junit.Test;
/**
* @author 许大仙
* @since 2021-12-19 22-33
*/
public class MessageServiceTest {
@Test
public void test(){
IMessageService messageService = new MessageServiceImpl();
String gradle = messageService.echo("gradle");
System.out.println("gradle = " + gradle);
}
}
4.8 Gradle 命令
- 既然 Gradle 是一个构建工具,那么也可以直接使用命令进行打包测试操作:
gradle build test
- 当上面的命令进行构建的时候,所有的生成字节码文件都会保存在项目中的
build
目录中。
第五章:IDEA 创建 Gradle 的 web 项目(⭐)
5.1 概述
- 在 Gradle 之中,所有的项目的创建都有自己的创建模板,而之所以使用开发工具,就是可以直接通过开发工具,方便的实现这些项目结构模板的自动创建,如果要创建 WEB 项目,那么也可以直接通过 IDEA 图形化工具来完成。
5.2 创建项目
- 创建 web 项目的时候一定要先存在 Java 项目(plugin),而后再追加 WEB 功能。
5.3 Gradle 的 Web 项目组成
.
|-- build.gradle # Gradle的核心配置文件,和Maven的pom.xml文件相当
|-- gradle # 保存有GradleWrapper相关配置
| `-- wrapper
| |-- gradle-wrapper.jar
| `-- gradle-wrapper.properties
|-- gradlew
|-- gradlew.bat
|-- settings.gradle
`-- src # 保存所有的程序源代码目录
|-- main
| |-- java
| |-- resources
| `-- webapp # 保存传统的如JSP页面的目录
| `-- index.jsp
`-- test # 保存所有的测试程序的代码
|-- java
`-- resources
- build.gradle详解
plugins {
id 'war' // 配置的是一个Web插件(Web项目)
id 'java' // 配置的是一个Java插件(Java项目)
}
group 'com.github.fairy.era' // 组织名称
version '1.0' // 版本号
sourceCompatibility = 11 // 源代码版本
repositories { // 仓库配置
mavenCentral()
}
dependencies { // 依赖管理
testImplementation group: 'junit', name: 'junit', version: '4.13.2'
}
tasks.withType(JavaCompile){ // 针对程序编译的任务进行配置
options.encoding = "UTF-8"
}
5.4 依赖配置
- 如果想开发 WEB 程序,一定要在 build.gralde 里面引入 jsp 和 servlet 相关的依赖,所以修改 build.gralde 文件,内容如下:
plugins {
id 'war' // 配置的是一个Web插件(Web项目)
id 'java' // 配置的是一个Java插件(Java项目)
}
group 'com.github.fairy.era' // 组织名称
version '1.0' // 版本号
sourceCompatibility = 11 // 源代码版本
repositories { // 仓库配置
mavenCentral()
}
dependencies { // 依赖管理
testImplementation group: 'junit', name: 'junit', version: '4.13.2' // junit 4.x
compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1' // servlet
compileOnly group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '2.3.3' // jsp
}
tasks.withType(JavaCompile){ // 针对程序编译的任务进行配置
options.encoding = "UTF-8"
}
5.5 创建 WEB 程序
- 创建一个 Servlet 程序代码,编写相应的 HTTP 返回信息。
- HelloServlet.java
package com.github.fairy.era;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
/**
* @author 许大仙
* @version 1.0
* @since 2021-12-20 08:08
*/
@WebServlet(name = "HelloServlet", value = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("Hello Gradle");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
5.6 程序打包
- 所有的 Gradle 程序都是可以直接通过命令进行打包操作:
gradle build
- 由上图可知,默认情况下,所得到的 war 文件的名称组成为:
项目名称-版本号.war
,如果有需要也可以修改 build.gradle 配置文件,手工设置一个生成的*.war
文件名称,追加一个配置的任务(task)即可。
plugins {
id 'war' // 配置的是一个Web插件(Web项目)
id 'java' // 配置的是一个Java插件(Java项目)
}
group 'org.example' // 组织名称
version '1.0' // 项目版本
sourceCompatibility = 1.8 // 源代码版本
repositories {
mavenCentral() // 仓库配置
}
dependencies { // 依赖库管理
testImplementation group: 'junit', name: 'junit', version: '4.13.2'
providedCompile group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '2.3.3'
providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'
}
war {
archiveName "gradle.war"
}
- 整个 WEB 项目的基本开发流程和 Maven 是类似的,唯一不同的是依赖处的配置以及相关子任务的配置。