当前位置: 首页 > news >正文

Spring Boot教程之二十五: 使用 Tomcat 部署项目

Spring Boot – 使用 Tomcat 部署项目

Spring Boot 是一个基于微服务的框架,在其中创建可用于生产的应用程序只需很少的时间。Spring Boot 建立在 Spring 之上,包含 Spring 的所有功能。如今,它正成为开发人员的最爱,因为它是一个快速可用于生产的环境,使开发人员能够直接专注于逻辑,而不必费力配置和设置。

Tomcat 是一个非常流行的 Java Servlet 容器。Tomcat 是默认的 Spring Boot 服务器,它可以在同一个应用程序中管理多个应用程序,从而避免在单个应用程序中为每个应用程序进行多次设置。

在本文中,我们将创建一个简单的 Spring Boot 应用程序,其中我们将使用 Tomcat 服务器部署该应用程序。

Spring Boot 上的项目部署流程 

在 Tomcat Server 上部署 Spring Boot 应用程序涉及三个步骤:

  1. 创建示例 Spring Boot 应用程序
  2. 创建 Spring Boot WAR 的方法
  3. 将 WAR 部署到 Tomcat – 最好需要更高版本的 Tomcat。

步骤 1:为 Tomcat 创建示例 Spring Boot 应用程序

这是一个 Spring Boot Web 应用程序项目,即需要将项目部署到 Tomcat 上。该项目可以创建为基于 Maven 的项目,因此我们可以在 pom.xml 文件中指定所需的依赖项。

pom.xml->Configurations can be specified in a Maven project via pom.xml

由于项目需要使用 Tomcat 部署,因此必须将其打包为“WAR”  Web 应用程序资源或 Web 应用程序存档)。

基本上,pom.xml 应该具有与 spring boot 相关的依赖项,例如

  • spring-boot-starter-parent
  • spring-boot-starter-web
  • spring-boot-starter-tomcat 及其范围设置为提供“geeks-web-services”应该是 pom.xml 中“WAR”文件的名称

示例 1:

  • XML

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

 

    <groupId>com.geeksforgeeks</groupId>

    <artifactId>spring-boot-war-deployment-example-on-tomcat</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <!-- As we need to deploy the project as WAR, this is needed -->

    <packaging>war</packaging>

 

    <name>SpringBootWarDeploymentOnTomcatServer</name>

    <description>Demo project for Spring Boot deployable on Tomcat</description>

 

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.2.2.RELEASE</version>

        <relativePath/> <!-- lookup parent from repository -->

    </parent>

 

    <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <java.version>1.8</java.version>

    </properties>

    <dependencies>

        <!-- Spring web dependency -->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

            </dependency>

        <!--Servlet container has to be set as provided -->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-tomcat</artifactId>

            <scope>provided</scope>

        </dependency>

     

 

    <build>

    <!-- Our final war file name is geeks-web-services -->

    <finalName>geeks-web-services</finalName>

        <plugins>

            <plugin>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-maven-plugin</artifactId>

            </plugin>

        </plugins>    

         

    </build>

 

 

</project>

需要一个控制器类,通过它我们能够以 GET 方法或 POST 方法调用服务。作为示例,让我们看“SampleRestControllerExample.java”,它包含两个“ GET ”方法

编写了两种方法,提供静态文本作为输出。 

由于这是一个简单的例子,我们只需展示一下调用“geeks-web-services/hello”时显示的内容,Hello Geek,这是一个简单的问候消息,祝您有个美好的一天。

调用“geeks-web-services/greet”时显示Hello Geek,通过减少源代码,可以快速轻松地开发基于Spring的应用程序。

@RestController 是控制器的专门版本。它包括 @Controller 和 @ResponseBody 注释,从而简化了控制器实现。

示例 2: SampleRestControllerExample.java

  • Java

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

 

// Annotation

@RestController

// Class

public class SampleRestControllerExample {

    @GetMapping("/hello")

    // Easy method just to print encouraging and consoling

    // words

    public String hello()

    {

        return "Hello Geek, this is a simple hello message to take care and have a nice day.";

    }

 

    @GetMapping("/greet")

    // Easy method just to print greeting message by saying

    // spring-based applications

    public String greet()

    {

        return "Hello Geek, Fast and easy development can be possible on Spring-based applications by reducing source code;.";

    }

}

第 2 步:创建 Spring Boot WAR 的方法

创建 Spring Boot WAR 有 3 种方法:

  • “Main” 类应该包含主类中的“extends SpringBootServletInitializer” 类。
  • “嵌入式 servlet 容器应标记为已提供。
  • 打包应该是 WAR

SpringBootWarDeploymentOnTomcatServer.java 是我们的主类

例子:

  • Java

// Java Program to Illustrate SpringBoot WarDeployment

// On Tomcat Server

 

// Importing required classes

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.builder.SpringApplicationBuilder;

import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

// Annotation

@SpringBootApplication

 

// Class

public class SpringBootWarDeploymentOnTomcatServer   

  extends SpringBootServletInitializer {   

  @Override   

  // Configuring method has to be overridden   

  protected SpringApplicationBuilder   

    configure(SpringApplicationBuilder application){       

    return application.sources(           

      SpringBootWarDeploymentOnTomcatServer.class);   

  }   

   

  // Method 2   

  // Main driver method   

  public static void main(String[] args){       

    SpringApplication.run(           

      SpringBootWarDeploymentOnTomcatServer.class,           

      args);   

  }

}

我们可以使用命令行运行 Maven 步骤,

mvn clean install -X

让我们通过图像来看一下项目结构和目标文件夹:

当WAR文件创建成功后,控制台中会显示WAR文件路径以及“BUILD SUCCESS”的信息,如下图所示:

WAR 文件已创建

步骤 3:将 WAR 部署到 Tomcat 

如果之前没有安装Apache Tomcat Server,则必须安装。最好使用更高版本的 tomcat。例如,我们使用 tomcat 版本 9.0.x。

要使用合适的 tomcat 版本和 java 版本,检查HTML 文件会很有帮助。在上一步中,我们得到了“geek-web-services.war”,必须将其复制到 tomcat 的“webapps”文件夹下。

现在,打开命令提示符并指向 tomcat 位置的 bin 文件夹, 

需要从 bin 文件夹提供“startup.bat”

该图显示 Spring Boot 已启动

而且我们的 war 文件也部署在 tomcat 中。下面的截图证实了这一点:

geek-web-services war 文件已部署

我们可以通过在浏览器中执行以下 URL 来测试相同内容:

geek-web-services/hello 输出

第二个输出:

geek-web-services/greetoutput

最后:

如上所述,Spring Boot 项目可以在 Tomcat 中部署。请记住以下列出的一些要点:

  • 默认情况下,Spring Boot 1.4.4.RELEASE 需要 Java 7 和 Spring Framework 4.3.6.RELEASE 或更高版本
  • 更高版本的Tomcat将有助于部署spring-boot应用程序。

相关文章:

Spring Boot教程之二十五: 使用 Tomcat 部署项目

Spring Boot – 使用 Tomcat 部署项目 Spring Boot 是一个基于微服务的框架&#xff0c;在其中创建可用于生产的应用程序只需很少的时间。Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。如今&#xff0c;它正成为开发人员的最爱&#xff0c;因为它是一个…...

解决 Git 默认不区分文件名大小写的问题

不得不说 Git 默认不区分文件名大小写真是一个大坑&#xff0c;由于之前的项目目录比较乱&#xff0c;项目下的文件夹命名都不规范&#xff0c;这两天一直在整理&#xff0c;然后今天从服务器将项目重新 clone 下来后发现&#xff0c;之前将所有文件名首字母改成大写的改动全部…...

python学opencv|读取图像(十二)BGR图像转HSV图像

【1】引言 前述已经学习了opencv中图像BGR相关知识&#xff0c;文章链接包括且不限于下述&#xff1a; python学opencv|读取图像&#xff08;六&#xff09;读取图像像素RGB值_opencv读取灰度图-CSDN博客 python学opencv|读取图像&#xff08;七&#xff09;抓取像素数据顺利…...

信息安全工程师-选择题考点总结

密码理论知识 基础理论 一个密码系统至少由明文、密文、加密算法、解密算法和密钥五个部分组成,而其安全性是由密钥决定的。 按照密钥特征的不同,密码体制分为:对称密码体制和非对称密码体制。 按照对明文加密方式的不同,密码体制分为:流密码和分组密码。 非对称密码体…...

重学SpringBoot3-WebClient配置与使用详解

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备2.1 依赖配置 3. WebClient配置3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例4.1 …...

springBoot中的日志级别在哪里配置

在Spring Boot中&#xff0c;日志级别的配置可以通过多种方式来实现&#xff0c;主要包括在配置文件中设置、使用自定义的logback配置文件&#xff0c;以及在代码中动态配置等。以下是一些具体的配置方法&#xff1a; 一、在配置文件中设置日志级别 Spring Boot默认使用appli…...

统一身份安全管理体系的业务协同能力

随着集团企业数字化组织转型深化&#xff0c;各组织机构间业务协同程度提升。研发业务协同、数据驱动生产决策等数字化生产协作工作体系得以展开&#xff0c;企业内数据流转加快。企业对统一身份安全管理体系的业务协同管理和支撑能力要求提升&#xff1a; 统一身份管理流程需…...

JAVA课堂笔记23(IO流 (java.io包中))

第五章&#xff1a;IO流 &#xff08;java.io包中&#xff09; 三、字符流 1. 字符流的父类(抽象类)&#xff1a; Reader&#xff1a;字符输入流 对应的操作为读操作 功能方法&#xff1a;read方法 Writer:字符输出流 对应的操作为写操作 功能方法&#xff1a;write方法 …...

C# DLT645 97/07数据采集工具

电表模拟器 97协议测试 07协议测试 private void btnSend_Click(object sender, EventArgs e) {string addr txtAddr.Text.Trim();string data txtDataFlg.Text.Trim();byte control 0x01;switch (cmbControl.SelectedIndex){case 0: control (byte)0x01; break;// 97协议c…...

中后台管理信息系统:Axure12套高效原型设计框架模板全解析

中后台管理信息系统作为企业内部管理的核心支撑&#xff0c;其设计与实现对于提升企业的运营效率与决策能力具有至关重要的作用。为了满足多样化的中后台管理系统开发需求&#xff0c;一套全面、灵活的原型设计方案显得尤为重要。本文将深入探讨中后台管理信息系统通用原型方案…...

Reactor 响应式编程(第四篇:Spring Security Reactive)

系列文章目录 Reactor 响应式编程&#xff08;第一篇&#xff1a;Reactor核心&#xff09; Reactor 响应式编程&#xff08;第二篇&#xff1a;Spring Webflux&#xff09; Reactor 响应式编程&#xff08;第三篇&#xff1a;R2DBC&#xff09; Reactor 响应式编程&#xff08…...

JVM 双亲委派模型以及垃圾回收机制

目录 1. JVM 内存区域划分 2. JVM 中类加载的过程 1) 类加载的基本流程 2) 双亲委派模型 3. JVM 中垃圾回收机制 1) 找到垃圾 a) 引用计数 b) 可达性分析 2) 释放垃圾 1. JVM 内存区域划分 一个运行起来的 Java 进程&#xff0c;其实就是一个 JVM 虚拟机。 而进程是…...

Delphi编写涂鸦桌面的小程序

用Delphi编写涂鸦桌面的小程序&#xff0c;类似于腾讯会议中的画板功能的实现。这里用Delphi实现代码给大家提供一些思路&#xff1b; 首先&#xff0c;新建一个Application&#xff0c;将Form1的WindowState设为wsMaximized&#xff0c;BorderStyle设为bsNone。这样做的目的就…...

智星云技术文档:GPU测速教程

安装gpu burn git clone https://github.com/wilicc/gpu-burn cd gpu-burn/ make测试 ./gpu_burn 60100.0% procd: 14280 (7373 Gflop/s) - 13390 (6997 Gflop/s) - 15912 (7110 Gflop/s) - 13184 (7055 Gflop/s) - 13464 (7369 Gflop/s) - 13974 (7351 Gflop/s) - 16626 (7…...

《Kali Linux 软件源更换攻略:优化软件获取与系统更新》

KALI为什么要换源 速度提升 Kali Linux 默认的软件源服务器通常位于国外。在从这些国外源下载软件包、更新系统时&#xff0c;会受到网络带宽、网络延迟等因素的限制。例如&#xff0c;在中国&#xff0c;连接到国外服务器的网络速度可能较慢&#xff0c;尤其是在下载大型软件…...

C# 在dataview可以直接增删改查mysql数据库

C# 在dataview可以直接增删改查mysql数据库 首先&#xff0c;确保你的项目中已经安装了MySql.Data。你可以通过NuGet包管理器安装它&#xff1a; Install-Package MySql.Data -Version 8.0.28using System; using System.Data; using MySql.Data.MySqlClient;public class My…...

C#—泛型约束

C#—泛型约束 概念&#xff1a; 泛型约束就是告知编译器类型参数必须具备的功能。 在没有任何约束的情况下&#xff0c;类型参数可以是任何类型。 编译器只能假定 System.Object 的成员&#xff0c;它是任何 .NET 类型的最终基类。当分配给泛型的类型参数不满足约束的类型时&…...

MeiliSearch:一款轻量级开源搜索引擎

Meilisearch 是由 Meili &#xff08;一家总部位于法国的软件开发公司&#xff09;创建的搜索引擎&#xff0c;目前在 Github 上有 47.9k stars。 Meillisearch 具备以下特色功能&#xff08;ChatGPT-4o 翻译&#xff09;&#xff1a; 混合搜索&#xff1a;结合语义搜索和全文…...

Ansible playbook 详解与实战操作

一、概述 playbook 与 ad-hoc 相比,是一种完全不同的运用 ansible 的方式&#xff0c;类似与 saltstack 的 state 状态文件。ad-hoc 无法持久使用&#xff0c;playbook 可以持久使用。 playbook 是由一个或多个 play 组成的列表&#xff0c;play 的主要功能在于将事先归并为一…...

青少年夏令营管理系统的设计与开发(社团管理)(springboot+vue)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...