Gradle篇(入门到精通)

news2024/11/24 14:07:45

目录

一、前言

1. 项目构建历史

1.1. 传统方式

1.2. 构建工具

1.3. Gradle

2. 初始 groovy

2.1. 什么是 Groovy

2.2. Groovy 安装环境

2.3. groovy 与 Java 对比

3. groovy 特性

3.1. 基础语法

3.2. 闭包

二、gradle 实战

1. Gradle 环境搭建

1.1. 安装 gradle

1.2. Gradle 搭建Java工程

1.3. Gradle 搭建 web 工程

2. Gradle流程

2.1. build.gradle 详解

Project对象介绍

Task任务介绍

知识结论

2.2. 自定义任务

2.3. Gradle 生命周期

三、Gradle高级

1. Gradle依赖管理

1.1. 仓库配置

1.2. 依赖管理

1.3. 解决依赖冲突

2. Gradle 多项目构建

2.1. 项目拆分

2.2. 项目发布

3. 嵌入式 tomcat 配置

配置tomcat

四、Gradle与Maven有什么区别?


一、前言

1. 项目构建历史

1.1. 传统方式

依赖管理 : 最开始的时候如果需要依赖第三方的 jar 包,需要把 jar 放到 lib 目录中,

如果 jar 包多了不好管理,很容易出现版本冲突问题.

每个项目需要使用到同一个jar包都得拷贝一份到项目中,很占用存储空间。非常麻烦!!!

测试 : 每个功能都需要书写测试类,在main中写测试非常麻烦,能不写一般都是不会写.就算写了也是很简单的测试下

而已。

打包 : 通过 eclipse或者idea 打包然后传递到服务器或者放入依赖的项目中.麻烦,繁琐。

上传 : 通过一些文件上传工具(FTP) 上传jar包到项目下。

1.2. 构建工具

依赖管理 : 可以做依赖管理,将 jar 包统一管理起来,更加的清晰和方便,而且仅仅是依赖管理,没有拷贝jar包到项目

中.

自动化: 可以自动测试\打包\发布

原则: 机器能做的事情,绝不自己动手去做.大大提高开发效率.

主流的构建工具:

  1. Ant (Apache Ant)

软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java 环境中的软件开发。

  1. Maven

从 Ant 中借用了绝大多数构建任务,其突出的是依赖管理和项目发布

  1. Gradle

使用 Groovy 语言 构建脚本,不再像 Maven 一样使用 XML

1.3. Gradle

一个开源的项目自动化构建工具,建立在 Apache Ant 和 Apache Maven 概念的基础上,

并引入了基于 Groovy 的特定领域语言(DSL),而不再使用 XML 形式管理构建脚本.

DSL(Domain Specific Language)定义:针对某一领域,具有受限表达性的一种计算机程序设计语言。

只针对一个领域做出来的简洁语言,而非为了通用而设计

2. 初始 groovy

2.1. 什么是 Groovy

Groovy 是基于Java虚拟机的一种敏捷的动态语言,它是一种成熟的OOP (面向对象)编程语言,

既可以用于面向对象编程,又可以用作纯粹的脚本语言。

使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。

Java 与 Groovy 的不同点或优势

  • Groovy 完全兼容 Java 语法,可做脚本也可做类
  • 分号是可选的,一般不加分号,以换行作为结束
  • 类,方法,字段都是公共的,没有访问权限限制
  • 默认生成具名(名值对)参数构造器 key:value
  • 字段不定义访问权限时,编译器自动给字段添加 getter/setter 方法
  • 字段可使用点来获取,无访问权限的也可使用 getter/setter 来操作
  • 方法可省略 return 关键字,自动检索最后一行的结果作为返回值

Groovy 的高级特性

  • assert 断言: 可以用 assert 代替之前 Java 的断言语句
  • 可选类型: 可使用类 JavaScript 的弱类型,可使用 def 来表示任意类型
  • 方法调用: 调用带参方法时可省略括号.
  • 字符串定义: 字符串定义有三种方式,单引号,双引号,三个单引号
  • 集合 API: 集合的定义和使用更加简单,API 和 Java 有所不同,但兼容 Java API
  • 闭包: Groovy 的一大特性,跟方法类似的代码块,可赋给一个变量也可以做为参数传递给一个方法, 像普通方法一样调用.

2.2. Groovy 安装环境

下载groovy的环境

下载地址:The Apache Groovy programming language - Download

下载后解压,进入到bin目录下,输入命令查看对应的版本

可以使用控制台测试groovy环境

在窗口中输入 groovyConsole 命令,会弹出groovy的控制台,然后可以在控制台输入groovy的代码,

使用Ctrl + R 运行groovy的代码。

2.3. groovy 与 Java 对比

打开idea,创建groovy的工程

选择本地的groovy的开发环境。

下面演示groovy和Java的一些区别

groovy 与 Java 比较

  1. JavaBean 的定义
  • 可省略分号
  • 可省略 getter/setter
  • 可省略 return
  • 无权限修饰符自动生成 getter/setter
  • 默认带有具名构造器 key:value
  1. 创建对象和操作字段
  • getter/setter 方式操作字段
  • 点方式调用字段
  • 调用自动生成的getter/setter方法

定义学生的类,代码如下:

package com.zhengge.demo1

/**
 * groovy 与 Java 比较
 1 JavaBean 的定义
 1) 可省略分号
 2) 可省略 getter/setter
 3) 可省略 return
 4) 无权限修饰符自动生成 getter/setter
 5) 默认带有具名构造器  key:value

 2 创建对象和操作字段
 1) getter/setter 方式操作字段
 2) 点方式调用字段
 3) 调用自动生成的getter/setter方法
 */
class Stu {
    
    // 可以使用分号
    private String username;
    // 分号可以省略不写
    private String email
    // 无权限修饰符,自动生成get和set方法
    int age;
    
    // 提供get方法,return 可以不写
    String getUsername() {
        username
    }
    void setUsername(String username) {
        this.username = username
    }
    
}
package com.zhengge.demo1

// 按脚本的方式去执行
Stu stu = new Stu();

// 给username属性赋值
stu.setUsername("老王");
// 打印username
println(stu.getUsername());

// 给私有属性赋值
stu.email = "laowang@163.com";
// 打印私有属性   println stu.email
println(stu.email);

// 测试age,默认提供get和set方法
stu.setAge(20)
// 打印age属性
println(stu.getAge())
println(stu.age)

// 构造方法
Stu stu1 = new Stu(username: "老四",email: "laosi@163.com",age: 30);
println(stu1.username +" -- "+stu1.email +" -- "+stu1.age)

用groovy的语法定义类

package com.zhengge.demo1

class Teacher {

    def username;
    def email;
    def age;

}

编程测试类

package com.zhengge.demo1

Teacher teacher = new Teacher(username: "樱木",email: "ym@126.com",age:18);
println(teacher.username + " : " + teacher.email + " : "+teacher.age)

3. groovy 特性

3.1. 基础语法

定义变量、字符串等

package com.zhengge.demo2

// 定义变量
def name = "yjxz";

// 定义方法
void add(){
    println("hello");
}

// 调用方法
add();

// ==========定义字符串============

// 定义字符串
def str1 = 'string';
// 引用字符串
def str2 = "hello ${str1}";
// 按格式去输出字符串
def str3 = '''
    username:yingmu 
age:18'''

println str1
println str2
println str3

定义List集合

def list = ["老王","老四","樱木"];

// 添加元素
list.add("hello");
// groovy特有的语法
list << "world";

// 打印集合
println(list)
println(list.getClass())

// 遍历集合
list.each {
    it ->
        println it
}

定义map集合

def map = ["username":"老王","age":30]

// 向map添加元素
map.put("email","laowang@163.com");
// 可以直接点属性的方式添加元素
map.gender = "男";

// 打印map
println map
println map.getClass()

// 遍历map集合
for(String key:map.keySet()){
    println map.get(key);
}

map.each {
    it ->
        println it.key +" -- " + it.value
}

3.2. 闭包

定义闭包

闭包是Groovy中非常重要的一个数据类型或者说一种概念。

闭包是一种数据类型,它代表了一段可执行的代码

闭包的语法定义: { [closureParameters -> ] statements }

其中[closureParameters->]部分是一个可选的以逗号分隔的参数列表

statements可以为空,一行或者多行代码。

当参数列表确定时,->是必须的,他负责把参数和闭包的代码块分开,代码块可以由一行或者多行语句组成

一些闭包常用的定义形式:

{ name -> println name }

如果闭包没有定义参数的话,则隐含有一个参数,这个参数的名字交it,和this作用类似,it代表闭包的参数。

闭包实质上是一个groovy.lang.Closure类的实例,虽然他是一个代码块,但是他可以为任何一个变量或者字段赋

值,闭包中可以包含代码的逻辑,闭包中的最后一行语句,表示该闭包的返回值,不论该语句是否有return关键

字。

package com.zhengge.demo2

// 定义闭包
def c1 = {
    println "hello"
}

// 调用闭包方法
c1()
// 显示的调用
c1.call()

// ============带参数==============

def c2 = {
    str ->
        println str
        "hello"
}

def result = c2("abc");
println result

// ===============================

// 可以把闭包做为参数传入到方法中
def method1(Closure closure){
    // 调用闭包方法
    closure.call();
}
// 调用method1方法
method1(c1);

// 定义方法
def method2(Closure closure){
    closure.call("老王");
}
// 调用method2方法
method2(c2);

二、gradle 实战

1. Gradle 环境搭建

1.1. 安装 gradle

从官网上下载gradle安装文件,配置环境变量即可。

下载地址:Gradle | Releases

我下载的版本是4.6的版本,不推荐使用较高的版本。

配置环境变量

在窗口中执行gradle -v 的命令,查看执行的结果。

1.2. Gradle 搭建Java工程

创建java的工程。

输入组织名,项目或者模块名称和版本号

选择gradle对应的版本

创建后的工程

生成的项目中 build.gradle是非常重要的文件,类似于maven工程中的pom.xml配置文件。

编写Java代码,进行测试

package com.zhengge.demo1;

public class GradleDemo1 {

    public static void main(String[] args) {
        System.out.println("hello gradle");
    }

}

把编写好的工程打成jar包

生成了对应的 jar 包

1.3. Gradle 搭建 web 工程

创建web工程。

2. Gradle流程

2.1. build.gradle 详解

Gradle 构建脚本中最重要的两个概念是 project 和 Task,任何一个 Gradle 构建都由一个或者多个project 组成,

每个 project 包括许多的构建部分,可以是一个 jar 包,也可以是一个 web 应用,也可以是多个 jar 的整合,可以部署

应用和搭建环境.

每个 project 由一个或多个 Task 组成,每个 Task 表示在构建执行过程中的一个原子操作。

如编译,打包,生成 javadoc,发布到仓库等操作。

Project对象介绍

一个 project 代表一个正在构建的组件(jar/war文件),当构建开始时,Gradle 会基于 build.gradle 实例化一个

org.gradle.api.Project 对象.

并通过 project 变量来隐式调用其成员.

那 Project 的成员有哪些呢?

Project 中常用的属性有project (隐式使用),group,name,version

Project 其他常用配置

  1. plugins , apply plugin 用来引入插
  2. dependencies 依赖配置
  3. repositories 仓库配置
  4. task 任务书写
  5. ext,gradle.properties Project 中属性的其他配置方式

结论:所有的配置都会被封装到 Project 对象中。

Task任务介绍

每个任务在构建执行过程中会被封装成 org.gradle.api.Task 对象.

主要包括任务的动作和任务依赖.

任务动作定义了一个原子操作.可以定义依赖其他任务、动作顺序和执行条件.

那任务有哪些相关操作呢?

任务主要操作动作

dependsOn : 依赖相关操作

doFirst : 任务执行之前执行的方法

doLast: 任务执行之后执行的方法

定义任务代码

task t1{
    println "hello t1"
}

task t2(dependsOn:"t1"){
    doFirst {
        println("doFirst t2")
    }

    println("hello t2")

    doLast {
        println("doLast t2")
    }
}

Project 和 Project 以及 Project 和 Task 以及 Task 和 Task 之间的关系如下图:

Project1 依赖 Project2,所以需先构建 Project2 ,Project2 中有三个任务 Task FGH,

由于依赖关系,先执行 Task G 再执行Task F 再执行 Task H.

Project1 中的 Task 也是先执行被依赖的任务。

知识结论
  1. 直接定义在任务下的代码会在配置 project 时执行,其他时候不执行,就算依赖也不执行.
  2. 只有在doFirst 或 doLast 中配置的操作才会在调用任务或者依赖执行时调用。
  3. 所以以后自定义任务执行代码需要写在doFirst或doLast 中,除非先在构建Project 时就执行。

2.2. 自定义任务

自定义任务的方式

task t1{
    println "hello t1"
}

task t1(){
    println "hello t1"
}

任务的依赖配置

  1. 定义任务时参数依赖 (dependsOn:'
  2. 任务内部依赖 dependsOn 'taskName'
  3. 外部添加依赖 taskName1.dependsOn taskName2
task t1{
    doFirst {
        println "t1"
    }
}

task t2(dependsOn:"t1"){
    doFirst {
        println("t2")
    }
}

task t3{
    dependsOn "t1"
    doFirst {
        println "t3"
    }
}

task t4{
    doFirst {
        println "t4"
    }
}
t4.dependsOn t1

2.3. Gradle 生命周期

Gradle构建过程有三个阶段。

  1. 初始化

Gradle可以构建一个和多个项目。在初始化阶段,Gradle会确定哪些项目参与构建,并且为这些项目创建一

个Project实例。

通过 settings.gradle 判断有哪些项目需要初始化,加载所有需要初始化的项目的 build.gradle 文件并为每个

项目创建 project 对象

  1. 配置(Configuration)

在这个阶段,会配置project对象。将执行构建的所有项目的构建脚本。也就是说,会执行每个项目的

build.gradle文件。

执行各项目下的 build.gradle 脚本,完成 project 的配置,并且构造 Task 任务依赖关系图以便在执行阶段按

照依赖关系执行Task中的配置代码

  1. 执行(Execution)

Gradle确定要在执行期间创建和配置的任务子集。子集由传递给gradle命令和当前目录的任务名称参数确

定。

Gradle然后执行每个选定的任务。

通过配置阶段的 Task 图,按顺序执行需要执行的 任务中的动作代码,就是执行任务中写在 doFirst 或 doLast

中的代码。

可以通过回调(钩子)方法,执行自己想要执行的代码。

在settings.gradle配置类中添加如下代码

rootProject.name = 'tx_gradle_demo1'

gradle.settingsEvaluated {
    println "初始化阶段 settingsEvaluated..."
}

gradle.projectsLoaded {
    println "初始化阶段 projectsLoaded..."
}

gradle.beforeProject {
    println "初始化阶段 beforeProject..."
}

在build.gradle配置类中添加回调方法

task t1{
    doFirst {
        println "t1"
    }
}

// 钩子方法
gradle.afterProject {
    println '配置阶段 afterProject'
}
project.beforeEvaluate {
    println '配置阶段 beforeEvaluate'
}
gradle.projectsEvaluated {
    println '配置阶段 projectsEvaluated'
}
project.afterEvaluate {
    println '配置阶段 afterEvaluate'
}
gradle.taskGraph.whenReady {
    println '配置任务 whenReady'
}


// 执行阶段
gradle.taskGraph.beforeTask {
    println "执行阶段 before task"
}
gradle.taskGraph.afterTask {
    println "执行阶段 afterTask "
}
gradle.buildFinished {
    println '构建结束 buildFinished'
}

运行t1任务,执行后的结果如下

三、Gradle高级

1. Gradle依赖管理

1.1. 仓库配置

Gradle默认的本地仓库如下图

在idea中配置本地仓库的位置

在build.gradle中配置仓库

repositories {
    
    // 也可以公司内部的私服
    maven {
       url " http://localhost:8079/nexus/content/groups/public/"
    }

    // 配置阿里云私服
    maven {
        url "http://maven.aliyun.com/nexus/content/groups/public/"
    }

    // 从中央仓库下载依赖
    mavenCentral()
}

1.2. 依赖管理

Gradle依赖管理,在dependencies 中引入具体的坐标依赖。

  • group : 指明 jar 的组织名称
  • name : 指明 jar 包的项目或者模块名称
  • version: 指明 jar 包的版本

依赖阶段配置

  • 在 build.gradle 中的 dependencies 中配置依赖,依赖分以下四种依赖.
  • 源码依赖: compile , runtime
  • 测试依赖: testCompile, runtime

依赖配置

  • compile 配置依赖的 jar ,源码、测试代码编译和运行期间都存在.
  • runtime 配置依赖的 jar,只有源码和测试代码在运行期间存在.
  • testCompile 配置依赖的 jar,测试代码的编译和运行期间都存在.
  • testRuntime 配置依赖的 jar,测试代码在运行期间存在.
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'org.mybatis', name: 'mybatis', version: '3.4.5'
    compile group: 'com.alibaba', name: 'fastjson', version: '1.2.62'
    compile group: 'dom4j', name: 'dom4j', version: '1.6.1'
}

1.3. 解决依赖冲突

管理依赖的最重要的环节就是传递性依赖过程中存在的版本冲突的问题处理.

在之前的手动管理依赖过程中经常遇到版本冲突问题,版本一冲突程序就无法正常运行。

而作为版本管理工具就应该拥有解决此问题的功能。

Maven自动解决版本冲突方式

  1. 第一声明优先原则,引入坐标的位置在上方,优先声明的,默认引入到工程中。
  2. 路径近者优先原则,直接依赖的坐标比传递依赖坐标路径近,最终直接依赖的坐标引入到工程中。

Gradle 的默认自动解决版本冲突的方案是选用版本最高的。

一般项目都是向下兼容,所以 Gradle 的自动解决方案也是合理的。

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile group: 'org.springframework', name: 'spring-expression', version: '4.2.5.RELEASE'
    compile group: 'org.springframework', name: 'spring-beans', version: '5.1.3.RELEASE'
}

可以配置不解决冲突。

configurations.all{
    resolutionStrategy{
        // 修改 gradle不自动处理版本冲突
        failOnVersionConflict()
    }
}

设置手动解决冲突,第一种方式:

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile group: 'org.springframework', name: 'spring-expression', version: '4.2.5.RELEASE'
    compile (group: 'org.springframework', name: 'spring-beans', version: '5.1.3.RELEASE'){
        exclude group: "org.springframework",module: "spring-core"
    }

}

第二种方式:排除所有jar包的依赖。

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile group: 'org.springframework', name: 'spring-expression', version: '4.2.5.RELEASE'

    /*
    compile (group: 'org.springframework', name: 'spring-beans', version: '5.1.3.RELEASE'){
        // 排除依赖
        exclude group: "org.springframework",module: "spring-core"
    }
    */

    compile (group: 'org.springframework', name: 'spring-beans', version: '5.1.3.RELEASE'){
        // 排除依赖
        // exclude group: "org.springframework",module: "spring-core"
        transitive = false
    }
    
}

还可以设置锁定指定的版本。

/**/
configurations.all{
    /*
    resolutionStrategy{
        // 修改 gradle不自动处理版本冲突
        failOnVersionConflict()
    }
    */

    // 指定具体的版本
    resolutionStrategy{
        force 'org.springframework:spring-core:5.2.4.RELEASE'
    }

}

2. Gradle 多项目构建

2.1. 项目拆分

按着模块进行项目拆分,首先有父工程(子模块项目管理,公共信息配置)、domain模块(存放实体类)、

core模块(存放业务类和持久层类)、admin模块(系统后台管理模块)、portal模块(门户模块)。

项目结构及其依赖关系如下:

创建父工程,父工程是用来管理子模块,不需要编写代码,可以把src的目录删除掉。

在父工程中创建子模块,有domain、core、admin(web工程)和portal(web工程)子模块。

创建后的项目结构

查看父工程的settings.gradle的配置类,里面定义了所有的子模块。

设置项目之间的依赖关系

core模块依赖 domain模块

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    // 依赖domain模块
    compile project(":tx_domain")
}

admin依赖core模块

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile project(":tx_core")
}

portal依赖 core 模块

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile project(":tx_core")
}

在父工程中管理所有的公共信息的配置,修改build.gradle的配置。

// 所有的项目统一进行属性管理,包括父工程
allprojects {
    // 组织名称
    group 'cn.tx'
    // 版本
    version '1.0-SNAPSHOT'
    // java插件
    apply plugin: 'java'
    // jdk编译版本
    sourceCompatibility = 1.8
    // 仓库
    repositories {
// 公司私服
maven {
    url " http://localhost:8079/nexus/content/groups/public/"
}
// 配置阿里云私服
maven {
    url "http://maven.aliyun.com/nexus/content/groups/public/"
}

        mavenCentral()
    }
}

// 子模块的配置,不包含父工程
subprojects {
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }
}

删除掉其他子模块build.gradle重复的配置

在父工程或者子工程中引入坐标依赖

// 子模块的配置,不包含父工程
subprojects {
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
        // 引入jar包
        compile group: 'com.alibaba', name: 'fastjson', version: '1.2.47'

    }
}

2.2. 项目发布

项目发布可以将咱们写好的模块发布给别人去使用,也可以发布到公司的公共仓库以供依赖的项目使用.

这是公司中多项目协同合作的重要环节。

在父工程的build.gradle中添加发布插件。

// 所有的项目统一进行属性管理,包括父工程
allprojects {
    // 组织名称
    group 'cn.tx'
    // 版本
    version '1.0-SNAPSHOT'
    // java插件
    apply plugin: 'java'
    // 发布插件
    apply plugin :'maven-publish'
    // jdk编译版本
    sourceCompatibility = 1.8
    // 仓库
    repositories {
        // 公司私服
        maven {
            url " http://localhost:8079/nexus/content/groups/public/"
        }
        // 配置阿里云私服
        maven {
            url "http://maven.aliyun.com/nexus/content/groups/public/"
        }
        // 从中央仓库下载依赖
        mavenCentral()
    }

    // 编写配置
    publishing {
        publications {
            // publishProject 为自定义名称,可写多个发布任务
            publishProject(MavenPublication){
                from components.java  // 发布 jar 包
                // from components.war  // 发布 war 包
            }
        }

        // 配置发布到哪里
        repositories {
            maven {
                //指定要上传的 maven 私服仓库
                url = "http://localhost:8079/nexus/content/repositories/snapshots/"
                //认证用户和密码
                credentials {
                    username 'admin'
                    password 'admin123'
                }
            }
        }
    }
}

// 子模块的配置,不包含父工程
subprojects {
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
        // 引入jar包
        compile group: 'com.alibaba', name: 'fastjson', version: '1.2.47'
    }
}

generatePomFileForPublishProjectPublication : 生成 pom 文件

publish : 发布到 repositories 中指定的仓库(一般为 Maven 私服)

publishPublishProjectPublicationToMavenLocal : 执行 publishProject 指定操作到指定仓库

publishPublishProjectPublicationToRepository : 执行 publishProject 中的操作并发布到指定仓库(私服)

publishToMavenLocal : 执行所有发布任务中的操作发布到本地 maven 仓库

一般在公司就是将项目发布到私服供其他项目使用.直接操作 publish,发布到本地使用 publishToMavenLocal 即

可.

3. 嵌入式 tomcat 配置

配置tomcat

对于 JavaWeb 项目来说,web 容器是必不可少的,毕竟 JavaWeb 项目需要运行在 web 容器中,

接下来咱们就看下使用 Gradle 如何加入 web 容器。

gradle 使用嵌入式 Tomcat 部署 web 项目。

在 gradle 中,嵌入式 Tomcat 使用 gradle-tomcat-plugin

文档 : https://github.com/bmuschko/gradle-tomcat-plugin/blob/master/README.md

在tx_admin中的工程中,build.gradle中添加如下的配置代码。

// war包插件
apply plugin: 'war'

// 引入tomcat插件
apply plugin: "com.bmuschko.tomcat"

// 将二进制插件添加到 build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "com.bmuschko:gradle-tomcat-plugin:2.5"
    }
}

dependencies {
    compile project(":tx_core")
    // https://mvnrepository.com/artifact/com.alibaba/fastjson
    compile group: 'com.alibaba', name: 'fastjson', version: '1.2.68'

    // 配置依赖 Tomcat 版本
    def tomcatVersion = '8.0.42'
    tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
            "org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}",
            "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}"
}

// tomcat配置
tomcat{
    httpPort = 8080
    contextPath = "/"
}

引入tomcat插件后,右侧显示出了tomcat插件运行的命令。

启动 Tomcat,运行项目 :在 IDEA右边出现 4个任务按钮,如右

tomcatJasper : 调用 jsp 转化器,将 jsp 转为类并编译为 class 文件.

tomcatRun : 启动 tomcat 服务器部署项目.

tomcatRunWar : 启动 tomcat 服务器部署 war

tomcatStop : 关闭 tomcat 服务器.

编写一个servlet进行测试

加入servlet的依赖

providedCompile group: "javax.servlet",name: "javax.servlet-api",version: "3.1.0"

编写servlet,打开浏览器访问

package cn.tx.demo1;

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;

@WebServlet(name = "Demo1Servlet",value = "/demo1")
public class Demo1Servlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("hello gradle");
        response.getWriter().println("hello gradle");
    }
}

四、Gradle与Maven有什么区别?

Gradle和Maven都是Java项目的构建工具,但它们有一些区别:

  1. 语法:Gradle使用Groovy语言进行编写,而Maven使用XML。Groovy更加灵活易读,XML更加严谨易于重用。
  2. 性能:Gradle比Maven更加高效快速,因为它使用了增量构建模式,只会重新构建被更改的模块,而Maven则需要重新构建整个项目。
  3. 插件:Gradle的插件生态更加丰富和现代化,而Maven的插件相对较为传统。此外,Gradle的插件可以非常容易地编写和定制,而Maven的插件相对繁琐。
  4. 维护:Maven有比较成熟的工具链和文档支持,而Gradle则相对较新,可能需要更多的自学。

综上所述,Gradle适用于需要更高性能和更为灵活的项目,而Maven则适用于更加稳定成熟的项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8.FreeRTOS之软件定时器

什么是定时器&#xff1f; 简单可以理解为闹钟&#xff0c;到达指定一段时间后&#xff0c;就会响铃。 STM32 芯片自带硬件定时器&#xff0c;精度较高&#xff0c;达到定时时间后会触发中断&#xff0c;也可以生成 PWM 、输入 捕获、输出比较&#xff0c;等等&#xff0c;功…

MySQL 9从入门到性能优化-系统信息函数

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

人脸识别算法 - 专利1分析

专利CN117576758A中说明了一种人脸识别算法的整体识别流程&#xff0c;本文将对这篇文章进行详细讲解&#xff0c;并说明有创造性的算法部分。 前置知识&#xff1a;人脸识别 人脸识别技术是一种通过计算机技术和模式识别算法来识别和验证人脸的技术。它能够用于识别人脸的身份…

Linux之nfs服务器和dns服务器

NFS服务器 NFS&#xff08;Network File System&#xff0c;网络文件系统)&#xff0c;NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中&#xff0c;而在本地端的系统 中看来&#xff0c;那个远程主机的目录就好像是自己的一个磁盘分区一样。 注&am…

第十八章 用于大型程序的工具

18.1 异常处理 异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理。异常使得问题的检测与解决过程分离开来。 18.1.1 抛出异常 当执行一个throw时&#xff0c;跟在throw后面的语句将不再被执行。相反&#xff0c;程序的控制权从throw转…

红米K80入网,骁龙8至尊版加持主打极致性价比

小米年度旗舰小米 15、15Pro 已经于本周二正式发布&#xff0c;不过 4499 元与 5299 元起售价想必劝退了不少追求极致性价比的小伙伴儿。 于是有同学表示&#xff1a;接下来人民的希望就全看旗舰捍门员红米了。 好消息是&#xff0c;目前新款红米 K80 系已获入网许可&#xff0…

ARM base instruction -- bfi

Bitfield Insert copies a bitfield of <width> bits from the least significant bits of the source register to bit position <lsb> of the destination register, leaving the other destination bits unchanged. 位域插入将<width>位的位域从源寄存器的…

uicc.hci.service的理解

一、uicc.hci.framework的java类 (1) HCIDevice i : getHCIservice 判断获取的service能否实现&#xff0c;若可以则调用并实现serviceimp&#xff0c;并记录appid。 ii : isHCIServiceAvaliable 用于获取service可用性的信息&#xff0c;返回0代表可用。 二、uicc.hci.servic…

更安全高效的文件传输工具,Ftrans国产FTP替代方案可以了解

文件传输协议&#xff08;FTP&#xff09;&#xff0c;诞生于1971年&#xff0c;自20世纪70年代发明以来&#xff0c;FTP已成为传输大文件的不二之选。内置有操作系统的 FTP 可提供一个相对简便、看似免费的文件交换方法&#xff0c;因此得到广泛使用。 随着企业发展过程中新增…

在元神操作系统启动时自动执行任务脚本

1. 背景 本文主要介绍让元神操作系统启动时自动执行任务脚本的方法&#xff0c;适用于无人化任务执行目的。将任务脚本及相关的应用程序准备好之后&#xff0c;把装有元神操作系统的U盘插入目标电脑&#xff0c;然后打开电脑电源就会自动完成所设置的任务。 2. 方法 &#x…

优雅的LUA数据记录方法-serpent序列化+LUA Table

目录 简述如何集成&#xff1f;如何使用序列化 反序列化 参考 简述 项目里需要使用LUA脚本将数据记录到文件&#xff0c;要方便的增加、查找、删除&#xff0c;要方便的加载与存回。 使用序列化/反序列化 lua table可以很容易实现这些功能。 序列化将table转换为字符串 反序列…

jmeter脚本-请求体设置变量and请求体太长的处理

目录 1、查询接口 1.1 准备组织列表的TXT文件&#xff0c;如下&#xff1a; 1.2 添加 CSV数据文件设置 &#xff0c;如下&#xff1a; 1.3 接口请求体设置变量&#xff0c;如下&#xff1a; 2、创建接口 2.1 见1.1 2.2 见1.2 2.3 准备创建接口的请求体TXT文件&#xff…

Sonatype Nexus 部署手册

文章目录 一、前言二、软件环境2.1 版本变更&#xff1a;2.1.1 变更存储的原因2.2.2 H2作为存储的注意点 三、资源配置四、开始部署4.1 部署jdk174.2 离线部署nexus4.2.1 下载4.2.2 部署1. 上传到服务器2. 解压3. 添加用户4. 修改启动参数5. 迁移sonatype-work &#xff0c;并授…

servlet开发

一、Servelet &#xff08;一&#xff09;Servelet概述 1.概念&#xff1a;Severlet是一门动态web资源开发技术。 2.本质&#xff1a;Severlet本质是一段Java程序&#xff0c;但和Java程序不同的是&#xff0c;Severlet程序无法独立运行&#xff0c;需要放服务器中&#xff…

opencv - py_imgproc - py_houghlines and py_houghcircles 霍夫线和圆变换

文章目录 1.霍夫线变换目标理论 OpenCV 中的霍夫变换概率霍夫变换其他资源 2.霍夫圆变换目标理论 1.霍夫线变换 目标 在本章中&#xff0c; 我们将了解霍夫变换的概念。我们将了解如何使用它来检测图像中的线条。我们将看到以下函数&#xff1a;cv.HoughLines()、cv.HoughLi…

数据结构 ——— 用堆解决TOP-K问题

目录 何为TOP-K问题 用堆解决TOP-K问题 代码实现 何为TOP-K问题 比如&#xff1a;整个专业的前10名&#xff0c;世界500强&#xff0c;富豪榜&#xff0c;游戏中前100的活跃玩家等 对于 TOP-K 问题&#xff0c;能想到的最简单直接的方式就是排序 但是&#xff0c;如果数据…

开发之翼:划时代的原生鸿蒙应用市场开发者服务

前言 随着"纯血鸿蒙" HarmonyOS NEXT在原生鸿蒙之夜的正式发布&#xff0c;鸿蒙生态正以前所未有的速度蓬勃发展。据知已有超过15000个鸿蒙原生应用和元服务上架&#xff0c;覆盖18个行业&#xff0c;通用办公应用覆盖全国3800万多家企业。原生鸿蒙操作系统降低了接…

WAF+AI结合,雷池社区版的强大防守能力

网上攻击无处不不在&#xff0c;为了保护我自己的网站&#xff0c;搜索安装了一个开源免费的WAF 刚安装完成就收到了海外的攻击&#xff0c;看到是海外的自动化攻击工具做的 雷池刚好也有AI分析&#xff0c;于是就尝试使用这个功能&#xff0c;看看这个ai能力到底怎么样 以下…

Elasticsearch —— ES 环境搭建、概念、基本操作、文档操作、SpringBoot继承ES

文章中会用到的文件&#xff0c;如果官网下不了可以在这下 链接: https://pan.baidu.com/s/1SeRdqLo0E0CmaVJdoZs_nQ?pwdxr76 提取码: xr76 一、 ES 环境搭建 注&#xff1a;环境搭建过程中的命令窗口不能关闭&#xff0c;关闭了服务就会关闭&#xff08;除了修改设置后重启的…

CSP2024 游记

又是一年 CSP。。。 10 月 5 日&#xff0c;终于过 S 初赛了。。。 然后开始漫长的备战。。 在考试开始前 1 day&#xff0c;我还在兢兢业业地学习图论。然后发现没有考。。。 10 月 25 日下午 15:30&#xff0c;来到 CQBS 试机。我想&#xff0c;怎么测试性能呢&#xff1…