Gradle开发起步
1 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)的概念,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之中配置的操作都是以任务的形式出现的,可以由开发者动态的进行各种任务的定义和任务的执行。
2 Windows系统安装Gradle
2.1 Gradle的官网
2.2 Gradle的安装说明
-
Gradle是一个全平台的构建工具,所以可以在任何操作系统中进行安装和配置,本次将在Windows系统中进行Gradle工具的安装。
-
Gradle需要依赖于Java环境,所以要先配置Java环境。
2.3 Gradle的安装和配置
- 解压Gradle:
- 配置GRADLE_HOME:
GRADLE_HOME
D:\develop\gradle-7.1.1
- 配置Path环境变量:
path
%GRADLE_HOME%\bin
2.4 测试Gradle是否安装成功
- 命令:
gradle -v
3 Gradle的基本配置
3.1 传统构建工具的使用的问题
-
Gradle现在已经安装成功了,但是按照传统构建工具的使用需要注意如下的问题:
-
①新时代所有的构建工具一般都会通过网络仓库来进行第三方组件包的获取,Gradle和Maven仓库的坐标的查询网站是同一个:中央仓库,如果要进行开发包的下载,那么需要使用国内的镜像(例如:阿里的Maven仓库镜像),
-
②配置本地化的缓存仓库路径,因为所有通过网络下载的开发包都需要在本地某个目录下进行存储,默认情况下Gradle是直接保存在用户目录(C盘下),但是考虑到长期的使用问题,就建议在专属的磁盘中进行配置。
-
3.2 Gradle的基本配置
3.2.1 本地存储
- 假设将所有的Gradle仓库的缓存(Maven是直接下载开发包)保存在磁盘的以下路径之中:
D:\develop\gradle-7.1.1\repository
- 如果要想进行本地仓库的配置直接配置环境属性即可(不是去修改配置文件),追加一个环境属性(注意:如果你是Administrator管理员,就新建系统变量;否则,新建用户变量),配置的内容为:
GRADLE_USER_HOME=D:\develop\gradle-7.1.1\repository
3.2.2 更换镜像源
-
对于当前的Gradle来说,已经明确的设置了一个工作的主目录,所以要想修改镜像地址,有如下两个方法:
-
①在
init.d
目录中建立一个init.gradle
的配置文件(Gradle项目的全局配置文件),内容如下。
gradle.projectsLoaded {
rootProject.allprojects {
buildscript {
repositories {
def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
def NEXUS_URL = 'https://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if (repo instanceof MavenArtifactRepository) {
def url = repo.url.toString()
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
println("buildscript ${repo.url} replaced by $JCENTER_URL.")
remove repo
}
else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
println("buildscript ${repo.url} replaced by $GOOGLE_URL.")
remove repo
}
else if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
remove repo
}
}
}
jcenter {
url JCENTER_URL
}
google {
url GOOGLE_URL
}
maven {
url NEXUS_URL
}
}
}
repositories {
def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
def NEXUS_URL = 'https://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if (repo instanceof MavenArtifactRepository) {
def url = repo.url.toString()
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
println("buildscript ${repo.url} replaced by $JCENTER_URL.")
remove repo
}
else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
println("buildscript ${repo.url} replaced by $GOOGLE_URL.")
remove repo
}
else if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
remove repo
}
}
}
jcenter {
url JCENTER_URL
}
google {
url GOOGLE_URL
}
maven {
url NEXUS_URL
}
}
}
}
- ②在
GRADLE_USER_HOME
环境变量对应的目录中新建一个init.gradle
的配置文件(Gradle项目的全局配置文件),内容如下:
allprojects {
repositories {
def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/nexus/content/groups/public'
def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/nexus/content/repositories/jcenter'
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
}
}
}
4 IDEA创建Gradle的Java项目
4.1 概述
- 如果要想开发Gradle/Maven项目肯定要使用开发工具是最方便的,因为里面有一些项目的代码结构,那么如果说现在使用的Gradle开发,首先建议一定要将Gradle工具做一些简单配置。
4.2 检查IDEA是否识别Gradle的环境变量
- 在之前进行Gradle配置的时候,配置了Gradle的缓存路径,里面也存在了一个
init.gradle
的配置文件,这个配置必须被IDEA工具识别,如果没有被识别,需要自己手动配置。
4.3 创建Java项目
- IDEA之中直接提供了Gradle项目的支持,所以直接利用新建项目的形式创建Gradle项目。
4.4 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
| `-- resources
`-- test # 保存所有的测试程序代码
|-- java
`-- resources
- build.gradle详解:
plugins {
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'
}
4.5 创建Java源程序
- 在src/main/java目录下编写Java源代码:
- IMessageService.java
package top.open1024.service;
/**
* @author open1024
* @version 1.0
* @since 2021-08-11 22:51
*/
public interface IMessageService {
String echo(String msg);
}
- MessageServiceImpl.java
package top.open1024.service.impl;
import top.open1024.service.IMessageService;
/**
* @author open1024
* @version 1.0
* @since 2021-08-11 22:52
*/
public class MessageServiceImpl implements IMessageService {
@Override
public String echo(String msg) {
return "hello " + msg;
}
}
4.6 编写Junit单元测试
- 在src/test/java目录下编写Junit单元测试:
- MessageTest.java
package top.open1024.service;
import top.open1024.service.impl.MessageServiceImpl;
import org.junit.Test;
/**
* @author open1024
* @version 1.0
* @since 2021-08-11 22:58
*/
public class MessageTest {
@Test
public void test(){
IMessageService messageService = new MessageServiceImpl();
String gradle = messageService.echo("gradle");
System.out.println("gradle = " + gradle);
}
}
4.7 Gradle命令
- 既然Gradle是一个构建工具,那么也可以直接使用命令进行打包测试操作:
gradle build test
- 当上面的命令进行构建的时候,所有的生成字节码文件都会保存在项目中的
build
目录中。
注意:因为我们的javadooc中有中文,所以执行Gradle命令的时候可能会报错,那是因为在Windows的中文环境下,控制台的编码是GBK,需要在IDEA中修改控制台的编码。
5 IDEA创建Gradle的web项目
5.1 概述
- 在Gradle之中,所有的项目的创建都有自己的创建模板,而之所以使用开发工具,就是可以直接通过开发工具方便的实现这些项目结构模板的自动创建爱你,如果要创建WEB项目,那么也可以直接通过IDEA图形化工具来完成。
5.2 创建项目
- 创建web项目的时候一定要先存在Java项目(plugin),而后再追加WEB功能。
5.3 Gradle的Web项目组成
.
|-- build
| `-- tmp
| `-- war
| `-- MANIFEST.MF
|-- 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 'org.example' // 组织名称
version '1.0' // 项目版本
sourceCompatibility = 1.8 // 源代码版本
repositories {
mavenCentral() // 仓库配置
}
dependencies { // 依赖库管理
testImplementation group: 'junit', name: 'junit', version: '4.13.2'
}
5.4 依赖配置
- 如果想开发WEB程序,一定要在build.gralde里面引入jsp和servlet相关的依赖,所以修改build.gralde文件,内容如下:
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'
}
5.5 创建WEB程序
- 创建一个Servlet程序代码,编写相应的HTTP返回信息。
- HelloServlet.java
package top.open1024.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author open1024
* @version 1.0
* @since 2021-08-12 08:08
*/
@WebServlet(urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("hello gradle");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
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 "hello-gradle.war"
}
- 整个WEB项目的基本开发流程和Maven是类似的,唯一不同的是依赖处的配置以及相关子任务的配置。
评论区