Spring 项目 基于 Tomcat容器进行部署

文章目录

    • 一、前置知识
    • 二、本地Idea运行Spring项目
      • 1. 将写好的 Spring 项目先打包成 war 包
      • 2. 查看项目工件(Artifact)是否存在
      • 3. 配置 Tomcat
        • 3.1 添加一个本地 Tomcat 容器
        • 3.2 将项目部署到 Tomcat
      • 4. 运行项目
    • 三、基于 Tomcat 部署及多实例部署
      • 1. Spring 项目 WAR 包的部署方式
        • 1.1 直接放到 Tomcat 的 `webapps` 目录
        • 1.2 通过 Tomcat Manager 部署
        • 1.3 自定义部署路径(不放在 `webapps` 下)
      • 2. 部署多个相同版本的 Tomcat
        • 2.1 复制多份 Tomcat 实现独立部署
        • 2.2 使用多实例配置(共享 Tomcat 核心文件)
        • 2.3 使用 Docker 部署多个 Tomcat

尽管市场上许多新项目都已经转向 Spring Boot,但对于一些老旧的 Spring 项目,尤其是维护期较长、涉及多个业务的系统,依然需要开发者掌握如何将这些项目正确地部署到 Tomcat 容器中。因此,撰写这篇文章的目的就是为了帮助开发者和运维人员能够在面对老的 Spring 项目时,快速而准确地完成部署任务。

一、前置知识

在传统的 Java Web 项目中,静态资源(如 HTML/CSS/JS/图片等)通常存放在项目的 webapp 目录下。Tomcat 作为常用的 Servlet 容器,会将 webapp 目录作为默认的 Web 应用根目录,并会直接暴露其中的静态文件。

  • 默认行为
    如果在 webapp 目录中存放了资源(例如 webapp/images/logo.png),则可以通过以下 URL 直接访问:

    http://localhost:8080/images/logo.png
    

二、本地Idea运行Spring项目

1. 将写好的 Spring 项目先打包成 war 包

首先,使用 IDE 或者命令行工具将 Spring 项目打包为 WAR 文件。这个过程将创建一个包含所有 Web 应用内容(包括静态资源、配置文件等)的归档包。

image-20250109100040542

打包完成后,请确认目标路径中确实产生了 .war 文件。

提示:如果使用 Maven,需要在 pom.xml 中将 <packaging>jar</packaging> 改为 <packaging>war</packaging>

2. 查看项目工件(Artifact)是否存在

在某些 IDE(例如 IntelliJ IDEA)中,项目打包后的产物(.war.jar)会被称为 Artifact。因此,在部署到 Tomcat 前,需要先检查该 Artifact 是否已经正常生成。

image-20250109100300580

如果工件(Artifact)不存在,需要手动创建。常见步骤:

  1. 打开 IntelliJ IDEA 的 Project StructureArtifacts
  2. 点击左上角的 “+” 号,选择 “Web Application: Archive (或 exploded)”。
  3. 将你项目的 webapp 目录或输出配置到对应的 Artifact 中。

下面是一个在 IntelliJ IDEA 中创建 webapp 对应源模块作为工件的操作演示:

recording

小提示:创建好以后,名称可以改成与你想要的 Context Path 相匹配的名称,这样前端或其他调用者就可以使用对应路径访问。

3. 配置 Tomcat

当 Artifact 准备完毕后,就可以将此 Artifact 部署到 Tomcat 容器中进行运行或调试。

3.1 添加一个本地 Tomcat 容器

在 IntelliJ IDEA 中,打开 RunEdit Configurations → 点击 “+” 号,选择 Tomcat ServerLocal

image-20250109101333089

在弹出的配置窗口中:

image-20250109101429013

  • 指定 Tomcat 安装目录
    你需要事先下载并解压 Tomcat(可从 Tomcat 官网 获取),然后将解压路径填入 Tomcat Home
  • 选择合适的 JDK
    Tomcat 9 及以上版本通常兼容 JDK 8 或 11,具体根据你项目中使用的 Java 版本来决定。
3.2 将项目部署到 Tomcat

在配置好的 Tomcat Server 设置中,切换到 “Deployment” 选项卡:

image-20250109101832158

点击 “+” → Artifact,选择你在步骤 2 中创建或已有的 .war 文件(或 exploded 形式):

recording

  • Context Path
    在弹出的对话框里,你可以手动设置访问路径,例如 /myapp/demo
    若设置为 /,则相当于部署到根路径,下次访问就不需要带上项目名。

注意:如果你改变了 Artifact 的名称,最终在 Tomcat 中也可以将 Context Path 手动设置为你想要的值。这两者相辅相成,但在实际生产环境中,需要根据前端或接口约定来决定合适的 Context Path。

配置完成后,你可以在 “Deployment” 页面上看到该 Artifact 已经被添加到 Tomcat。

访问的 URL 地址示例
如果 Tomcat 默认端口为 8080,并且 Context Path 设置为 /intelligenceCommand,那么访问路径往往形如:

http://localhost:8080/intelligenceCommand/

image-20250109103942160

4. 运行项目

最后,点击 IntelliJ IDEA 上方的绿色运行按钮(或 Debug 按钮),启动本地 Tomcat。若控制台没有报错,说明部署成功,项目就能通过浏览器访问。

image-20250109102848965

  • 控制台输出:

    如果看到如下信息,表示服务器已正常启动:

    image-20250109104621817

  • 访问测试
    在浏览器中输入 http://localhost:8080/myapp(若 Context Path 是 myapp),就能看到你的应用首页或者相关接口数据,说明部署成功。

常见问题

  1. 端口占用问题:如果 8080 端口被占用,你需要在 Tomcat 中修改端口或者关闭占用 8080 的应用。
  2. 资源无法访问 404:检查静态资源是否正确放在 webapp 目录下,并且确认在 .war 包中已经包含这些文件。

三、基于 Tomcat 部署及多实例部署

1. Spring 项目 WAR 包的部署方式

1.1 直接放到 Tomcat 的 webapps 目录
  1. 打包成 WAR 包:

    • 使用 Maven 或 Gradle 将项目打包为 .war 文件。

    • Maven 示例命令:

      mvn clean package
      
    • 打包完成后,WAR 包通常在 target 目录下,例如:myapp.war

  2. 将 WAR 包放入 Tomcat 的 webapps 目录:

    • myapp.war 放入:

      <TOMCAT_HOME>/webapps/
      
  3. 启动 Tomcat 并自动解压:

    • 启动 Tomcat 后,Tomcat 会自动解压 myapp.war 并在 webapps 下生成同名目录。

    • 部署完成后,可以通过浏览器访问:

      http://<服务器地址>:<端口号>/myapp/
      

1.2 通过 Tomcat Manager 部署
  1. 启用 Tomcat 的 Manager 应用:

    • 编辑 <TOMCAT_HOME>/conf/tomcat-users.xml 文件,添加以下内容:

      <role rolename="manager-gui"/>
      <user username="admin" password="admin" roles="manager-gui"/>
      
    • 重启 Tomcat。

  2. 访问 Tomcat Manager:

    • 打开浏览器,访问:

      http://<服务器地址>:<端口号>/manager/html
      
    • 输入用户名和密码登录。

  3. 上传 WAR 包部署:

    • WAR file to deploy 部分,选择你的 .war 文件并点击 Deploy

1.3 自定义部署路径(不放在 webapps 下)
  1. 创建部署描述文件:

    • <TOMCAT_HOME>/conf/Catalina/localhost 下创建 myapp.xml 文件。
  2. 指定 WAR 包位置:

    <Context docBase="/path/to/myapp.war" reloadable="true" />
    
  3. 启动 Tomcat:

    • 部署完成后,可以通过浏览器访问:

      http://<服务器地址>:<端口号>/myapp/
      

2. 部署多个相同版本的 Tomcat

2.1 复制多份 Tomcat 实现独立部署
  1. 复制多个 Tomcat 目录:

    • 假设原始目录为 D:\tomcat-8.5.91

    • 复制并重命名为:

      D:\tomcat-instance1
      D:\tomcat-instance2
      
  2. 修改每个实例的端口配置:

    • 打开 conf/server.xml,修改以下端口以避免冲突:

      • HTTP 端口(必须配置):

        • HTTP 端口是接收浏览器或客户端通过 HTTP 协议访问的主要入口。
        • 默认是 8080,如果部署多个 Tomcat 实例,需要为每个实例分配不同的 HTTP 端口(如 80818082)。
        <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
        
      • AJP 端口(可选,通常不需要):

        • AJP 是一种用于代理服务器(如 Apache HTTP Server、Nginx)与 Tomcat 之间的通信协议。
        • 如果你没有使用 Apache 或 Nginx 等代理工具来转发请求,则 AJP 不会被用到
        • 默认是 8009,如果不需要,可以直接注释掉相关配置。
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
        
      • Shutdown 端口(必须配置):

        • Shutdown 端口用于通过命令关闭 Tomcat 实例。
        • 默认是 8005,在多个实例中需要确保每个 Shutdown 端口唯一,否则可能会导致关闭其他实例的问题。
        <Server port="8005" shutdown="SHUTDOWN">
        

        改为 80068007 等。

  3. 启动各个实例:

    • 分别进入 instance1instance2 的 bin 目录,运行:

      startup.bat
      

2.2 使用多实例配置(共享 Tomcat 核心文件)

如果需要节省磁盘空间,可以通过共享核心文件实现。

  1. 准备原始 Tomcat 核心目录:

    • 假设核心目录为 D:\tomcat-base
  2. 创建多个实例目录:

    • 创建实例目录,例如:

      D:\tomcat-instance1
      D:\tomcat-instance2
      

    每个目录需包含以下子目录:

    conf
    logs
    temp
    webapps
    work
    
  3. 配置 CATALINA_BASECATALINA_HOME

    • 修改每个实例的 startup.bat 脚本,添加以下内容:

      set CATALINA_HOME=D:\tomcat-base
      set CATALINA_BASE=D:\tomcat-instance1
      
    • 对 instance2,设置:

      set CATALINA_HOME=D:\tomcat-base
      set CATALINA_BASE=D:\tomcat-instance2
      
  4. 启动实例:

    • 分别进入每个实例的 bin 目录,运行:

      startup.bat
      

2.3 使用 Docker 部署多个 Tomcat
  1. 拉取 Tomcat 镜像:

    docker pull tomcat:8.5
    
  2. 运行多个容器:

    • 第一个实例:

      docker run -d --name tomcat-instance1 -p 8080:8080 tomcat:8.5
      
    • 第二个实例:

      docker run -d --name tomcat-instance2 -p 8081:8080 tomcat:8.5
      
  3. 访问容器:

    • 实例1:http://localhost:8080
    • 实例2:http://localhost:8081

注意事项

  1. 端口冲突:
    • 确保每个实例的 HTTP、AJP 和 Shutdown 端口不同。
  2. 资源分配:
    • 在同一服务器上运行多个实例时,合理分配 JVM 内存。
  3. 日志文件独立:
    • 确保每个实例的日志文件路径独立,避免混淆。
  4. 负载均衡(可选):
    • 使用 Nginx 或 Apache 将请求分发到多个实例,提高可用性。

总结

  • 单个 Tomcat 部署: 推荐直接将 WAR 包放入 webapps,由 Tomcat 自动解压和部署。
  • 多个 Tomcat 部署: 可通过复制多份目录或共享核心文件实现,Docker 是更现代化的部署方式。

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

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

相关文章

usbredir学习

文章目录 背景典型场景编译usbredirparserusbredirfilterusbredirparser/usbredirproto usbredirhostusbredirect/usbredirtestclient参考 背景 usbredir 是一种用于通过网络转发 USB 设备流量的网络协议。它也是一个软件包的名称&#xff0c;该软件包提供了一个解析库、一个 …

ESXI 安装教程(3) ---​vCenter Server 安装

不涉及复杂的操作此项可不安装 1.镜像加载到虚拟光盘 对应的网盘文件 2.打开文件路径 双击运行文件installer.exe 3.调整安装语言 4.点击安装 5. 6. 证书,有效问题导致此提示,非专业网络管理人员,不知道如何处理,此处点是即可 证书有效开始时间是安装时间8小时 证书有效结束…

【初识扫盲】逆概率加权

我们正在处理一个存在缺失数据的回归模型&#xff0c;并且希望采用一种非参数的逆概率加权方法来调整估计&#xff0c;以应对这种缺失数据的情况。 首先&#xff0c;我们需要明确问题的背景。我们有样本 { ( Y i , X i , r i ) : i 1 , … , n } \left\{\left(Y_i, \boldsym…

极客说|Azure AI Agent Service 结合 AutoGen/Semantic Kernel 构建多智能体解决⽅案

作者&#xff1a;卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&am…

【集成学习】Boosting算法详解

文章目录 1. 集成学习概述2. Boosting算法详解3. Gradient Boosting算法详解3.1 基本思想3.2 公式推导 4. Python实现 1. 集成学习概述 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过结合多个模型的预测结果来提高整体预测性能的技术。相比于单个模型&#xf…

小米vela系统(基于开源nuttx内核)——如何使用信号量进行PV操作

如何使用信号量进行PV操作 前言信号量1. 信号量简介2. NuttX中信号量的创建与使用2.1 Nuttx信号量的初始化和销毁2.2 信号量的等待和发布 3. 信号量的实际应用&#xff1a;下载任务示例3.1 实际代码3.2 代码说明3.3 执行说明 4. 信号量的优势与应用场景5. 常见应用场景&#xf…

CMake学习笔记(2)

1. 嵌套的CMake 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#xff0c;那么这个文件相对会比较复杂&#xff0c;有一种化繁为简的方式就是给每个源码目录都添加一个CMakeLists.txt文件&#xff…

旅游网站设计与实现

文末附有完整项目代码 在当今数字化时代&#xff0c;旅游网站成为人们获取旅游信息的重要途径。本文将详细介绍旅游网站的设计与实现&#xff0c;让你轻松了解其中的技术奥秘&#xff01; 一、项目背景 随着社会经济的发展&#xff0c;人们对精神消费愈发重视&#xff0c;旅游…

【C++】size_t究竟是什么?全面解析与深入拓展

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;一、什么是size_t&#xff1f;为什么需要size_t&#xff1f; &#x1f4af;二、size_t的特性与用途1. size_t是无符号类型示例&#xff1a; 2. size_t的跨平台适应性示例对…

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定&#xff0c;根据图示步骤继续导入项目 查看项目目录&#xff…

ssh2-sftp-client和ssh2配合使用js脚本快速部署项目到服务器

有时候因为服务器不能实现github或者gitlab的自动部署服务&#xff0c;所以就需要使用脚本来实现自动部署&#xff0c;可以省时省力&#xff0c;一劳永逸。这里就使用ssh2-sftp-client和ssh2来实现&#xff0c;即便是需要sudo权限&#xff0c;也是可以的。 1.先将本地打包后的…

深度解析Linux中的调试器gdb/cgdb的使用

Linux下我们编译好的代码&#xff0c;无法直接调试 gcc/g默认的工作模式是realse模式 程序要调试的话&#xff0c;必须是debug模式&#xff0c;也就是说编译的时候要加-g选项 gdb携带调试信息的exe 我们现在在文件夹里面创建一个文件lesson11 里面创建一个累加的代码&…

【Maui】动态菜单实现(绑定数据视图)

前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI&#xff0c;可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款开放源代码应用&#xff0c;是 X…

Bash语言的语法糖

Bash语言的语法糖 引言 在现代编程语言中&#xff0c;“语法糖”是一个非常常见的术语&#xff0c;它指的是那些使代码更加易读、易写的语法特性。尽管这些特性并不改变语言的功能&#xff0c;但它们能显著提升开发者的编程体验。在众多编程语言中&#xff0c;Bash&#xff0…

linux---Nginx详细教程(包含安装,网站部署)

Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也可以用作邮件代理服务器&#xff0c;其以占有内存少、并发能力强、稳定性高、丰富的功能集、低系统资源消耗而闻名。以下是对Nginx的详细教程&#xff1a; 一、Nginx简介 Nginx由俄罗斯人开发&#xff0c;第一个公开版…

RNN之:LSTM 长短期记忆模型-结构-理论详解-及实战(Matlab向)

0.前言 递归&#xff01;循环神经网络Recurrent Neural Network 循环神经网络&#xff08;又称递归神经网络&#xff0c;Recurrent Neural Network&#xff0c;RNN&#xff09;。是一种用于处理序列数据的神经网络结构&#xff0c;具有记忆功能&#xff0c;能够捕捉序列中的时…

泛目录和泛站有什么差别

啥是 SEO 泛目录&#xff1f; 咱先来说说 SEO 泛目录是啥。想象一下&#xff0c;你有一个巨大的图书馆&#xff0c;里面的书架上摆满了各种各样的书&#xff0c;每一本书都代表着一个网页。而 SEO 泛目录呢&#xff0c;就像是一个超级图书管理员&#xff0c;它的任务就是把这些…

初识@ffmpeg/ffmpeg库

前言 FFmpeg是一套可以用来记录、转换数字音频、视频,并且能够利用它们来创建一个新的流媒体格式的自由软件项目,它被广泛应用在视频处理、音频处理以及直播领域。其中,@ffmpeg/ffmpeg 是一个将 FFmpeg 编译为 WebAssembly(WASM)的库,可支持几乎所有的音视频格式。 安装…

【图像去噪】论文复现:反向扩散中加入MAP将扩散模型从高斯去噪推广到真实去噪!DiffusionVI的Pytorch源码复现,跑通源码,梳理理论,单卡可执行!

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 完整代码和训练好的模型权重文件下载链接见本文底…

Windows 蓝牙驱动开发-简介

蓝牙(英语&#xff1a;Bluetooth)是一种无线通信技术标准&#xff0c;用来让固定与移动设备&#xff0c;在短距离间交换资料&#xff0c;以形成个人局域网(PAN)。其使用短波特高频(UHF)无线电波&#xff0c;经由2.4至2.485 GHz的ISM频段来进行通信。1994年由电信商爱立信(Erics…