IDEA 中 Tomcat 部署 Java Web 项目(Maven 多模块 非 Maven 通用版)(linux+windows)

引言

Java Web 开发中,Tomcat 是最常用的 Servlet 容器,而项目类型通常分为 Maven 管理(依赖自动处理、多模块聚合) 和 非 Maven 纯手工管理(手动引入 jar 包、配置项目结构)。本文覆盖 两种项目类型 的 Tomcat 部署全流程,从 IDEA 配置到问题排查,手把手教你打通开发到运行的闭环,解决 90% 部署痛点!

一、环境准备(通用基础)

1. 核心环境

  • JDK:确保安装 JDK 1.8+(示例用 1.8 Oracle OpenJDK),通过 java -version 验证。
  • Tomcat:本地安装 Tomcat 8.5+(如 apache-tomcat-8.5.29),记住安装目录(后续配置用)。
  • IDEA:旗舰版或社区版(社区版需手动配置部分功能,本文以旗舰版为例)。

二、场景 1:Maven 多模块 Java Web 项目部署

1. 项目特征

  • 含 pom.xml,通过 Maven 管理依赖和多模块(如父模块 hami_parent + 子模块 hami_protal)。
  • 构建流程:clean → install 自动编译、打包,适合复杂聚合项目。
  •  依次为每个部分添加本地tomcat-server

       修改名字,热部署,端口号,jdk都不要填错

      

这里添加相应的 

点击apply ->ok  运行tomcat

(2)Maven 构建:生成 War 包
  • 右侧打开 Maven 面板,找到父模块(如 hami_parent [root]):
    • 先双击 Lifecycle → clean(清理旧构建产物)。
    • 再双击 Lifecycle → install(编译代码 → 打包成 war → 安装到本地仓库)。
  • 控制台输出 BUILD SUCCESS 后,检查子模块 target 目录,生成 xxx.war 和 xxx.war exploded(部署用解压包)。

(3)将生成的war包与jar包一并复制到tomcat的webapps路径下
 

(4)配置server.xml文件 

将下面的代码插入到server.xml文件中,注意这是我们自定义的<Service>,要与 自带的分开,防止嵌套

<Service name="Catalina1"><!-- 每个项目的端口号也要进行区分,保证不被占用 --><Connector port="8083" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URLEncoding="UTF-8"/><!-- 这里的AJP端口同样也要进行区分 --><Connector port="8011" protocol="AJP/1.3" redirectPort="8443" secretRequired=""/><Engine name="Catalina1" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /><!-- 这里是想要部署的对应项目的名称 --><Context docBase="hami_console-1.0-SNAPSHOT" path="/" reloadable="true"/></Host></Engine></Service><Service name="Catalina2"><!-- 每个项目的端口号也要进行区分,保证不被占用 --><Connector port="8084" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URLEncoding="UTF-8"/><!-- 这里的AJP端口同样也要进行区分 --><Connector port="8012" protocol="AJP/1.3" redirectPort="8443" secretRequired=""/><Engine name="Catalina1" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /><!-- 这里是想要部署的对应项目的名称 --><Context docBase="hami_file-1.0-SNAPSHOT" path="/" reloadable="true"/></Host></Engine></Service><Service name="Catalina3"><!-- 每个项目的端口号也要进行区分,保证不被占用 --><Connector port="8085" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URLEncoding="UTF-8"/><!-- 这里的AJP端口同样也要进行区分 --><Connector port="8013" protocol="AJP/1.3" redirectPort="8443" secretRequired=""/><Engine name="Catalina1" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /><!-- 这里是想要部署的对应项目的名称 --><Context docBase="hami_protal-1.0-SNAPSHOT" path="/" reloadable="true"/></Host></Engine></Service>

 (5)启动tomcat

发现我们的端口号启动成功:

并且 webapps目录下生成了相应的war,jar包目录,现在我们就可以 url直接访问我们的项目

 

 

这就说明部署成功了 

三、场景 2:非 Maven Java Web 项目部署(以 BookShop 为例)

1. 项目特征

  • 无 pom.xml,手动管理 jar 包(如 commons-codec-1.9.jar 放 WEB-INF/lib)。
  • 需手动配置项目结构、依赖、Web 模块,适合简单 Demo 或旧项目迁移。

2. 关键配置步骤

(1)Project Structure 全流程配置
  • 打开 File → Project Structure,按以下标签逐步配置:
① Project 标签(基础环境)
  • Name:项目名(如 BookShop)。
  • SDK:选 JDK 1.8
  • Language level:选 8 - Lambdas, type annotations
② Modules 标签(模块与依赖)
  • 选项目模块(如 BookShop):
    • Sources:标记 src 为源码目录(蓝色),test 为测试目录(绿色,可选)。
    • Dependencies
      • 点击 + → JARS or directories,引入 WEB-INF/lib 下的所有 jar 包(如 commons-codec-1.9.jarmysql-connector-java-5.1.5.jar)。
③ Facets 标签(Web 模块识别)
  • 点击 + → Web,关联项目的 web.xml(路径:WebContent/WEB-INF/web.xml):
    • 确认 Deployment Descriptors 中 web.xml 路径正确。
    • 配置 Web Resource Directories(如 WebContent 目录,作为静态资源根路径)。
④ Artifacts 标签(部署产物配置)
  • 点击 + → Web Application: Exploded → From Modules...,选项目模块(如 BookShop):
    • 生成 BookShop:war exploded(解压后的 Web 应用目录,用于 Tomcat 部署)。
    • 检查 Output Layout,确保 WEB-INF/classes(编译输出)和 WEB-INF/lib(jar 包)已包含。

 选中自己的项目

2)Tomcat Server 配置(与 Maven 项目类似)
  • 顶部 Run → Edit Configurations → 新建 Tomcat Server → Local
    • Server 标签:同 Maven 项目(选 Tomcat 目录、JDK、端口)。
    • Deployment 标签
      • 点击 + → Artifact,选 BookShop:war exploded(非 Maven 项目的解压部署包)。
    • 热部署:同 Maven 项目(选 Update classes and resources)。

(3)启动验证

  • 启动 Tomcat 后,访问 http://localhost:8085/BookShop/(路径与 Application context 一致),验证页面或接口。

3.将项目部署到tomcat

   在idea部署项目之后会产生一个classes文件夹,找到里面的_war_exploded文件夹

复制到tomcat的webapps里

配置server.xml文件

  <Service name="Catalina1"><!-- 每个项目的端口号也要进行区分,保证不被占用 --><Connector port="8088" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URLEncoding="UTF-8"/><!-- 这里的AJP端口同样也要进行区分 --><Connector port="8010" protocol="AJP/1.3" redirectPort="8443" secretRequired=""/><Engine name="Catalina1" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /><!-- 这里是想要部署的对应项目的名称 --><Context docBase="qcby2502_war_exploded" path="/" reloadable="true"/></Host></Engine></Service>

 启动tomcat,查看日志 8088端口启动成功

验证:

部署成功了

四、场景 3: 非 Maven Java Web 项目部署(linux)

首先要配置好linux环境:配置云服务器环境(腾讯云为例)_腾讯云服务器配置-CSDN博客

运行linux的工具:

1)将war_exploded文件夹打包进webapps目录并解压

2)配置server.xml

3) 开放配置的端口号(我这里配置的是8087)

  云服务器中:

linux系统中:

//添加8087端口规则
sudo iptables -A INPUT -p tcp --dport 8087 -j ACCEPT
//验证规则
sudo iptables -L -n | grep 8087

 

4)启动tomcat(注意要在bin目录中启动)

5)验证结果 :

部署成功 

五、场景 3:  Maven Java Web 项目部署(linux)

1)首先我们把生成的jar包,war包传到linux

2)配置server.xml文件(注意端口号和AJP端口不要冲突)

 <Service name="Catalina2"><!-- 每个项目的端口号也要进行区分,保证不被占用 --><Connector port="8083" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URLEncoding="UTF-8"/><!-- 这里的AJP端口同样也要进行区分 --><Connector port="8014" protocol="AJP/1.3" redirectPort="8443" secretRequired=""/><Engine name="Catalina1" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /><!-- 这里是想要部署的对应项目的名称 --><Context docBase="hami_console-1.0-SNAPSHOT" path="/" reloadable="true"/></Host></Engine></Service><Service name="Catalina3"><!-- 每个项目的端口号也要进行区分,保证不被占用 --><Connector port="8084" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URLEncoding="UTF-8"/><!-- 这里的AJP端口同样也要进行区分 --><Connector port="8012" protocol="AJP/1.3" redirectPort="8443" secretRequired=""/><Engine name="Catalina1" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /><!-- 这里是想要部署的对应项目的名称 --><Context docBase="hami_file-1.0-SNAPSHOT" path="/" reloadable="true"/></Host></Engine></Service><Service name="Catalina4"><!-- 每个项目的端口号也要进行区分,保证不被占用 --><Connector port="8085" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URLEncoding="UTF-8"/><!-- 这里的AJP端口同样也要进行区分 --><Connector port="8013" protocol="AJP/1.3" redirectPort="8443" secretRequired=""/><Engine name="Catalina1" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /><!-- 这里是想要部署的对应项目的名称 --><Context docBase="hami_protal-1.0-SNAPSHOT" path="/" reloadable="true"/></Host></Engine></Service>
3)开放端口 

 

4)验证 :

部署成功! 

六、总结

  • Maven 项目:依赖管理便捷,适合复杂多模块,通过 clean/install 自动构建,部署流程更标准化。
  • 非 Maven 项目:需手动配置依赖和结构,适合简单场景或旧项目,重点关注 Facets 和 Artifacts 配置。

无论哪种类型,掌握 Tomcat 热部署 和 Project Structure 核心配置 是关键!遇到问题先检查日志(IDEA 控制台 + Tomcat catalina.out),结合本文解决方案,部署效率直接拉zhizhi

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

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

相关文章

使用 React Native Web 实现三端统一开发

使用 React Native Web 实现三端统一开发 关键点 React Native Web 简介&#xff1a;React Native Web 是一个允许开发者使用 React Native 组件和 API 构建 Web 应用的库&#xff0c;支持在 iOS、Android 和 Web 上使用同一套代码。架构&#xff1a;通过 React DOM 渲染 Rea…

分享一个git上基于std::array实现的循环队列(Cycle Queue)模板类库

为充分利用向量空间,克服“假溢出”现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。 网上有很多关于循…

三维视频融合平台:如何构建动态感知的数字空间

分享大纲&#xff1a; 你的三维平台为何不能承载动态视频捷码打造三维视频融合平台的三步法则为何选择捷码 在智慧城市建设过程中&#xff0c;将实时视频与三维空间结合&#xff0c;已经成为一种主流趋势。传统视频监控模式&#xff0c;经常面临视频分散、操作复杂等问题。然而…

【AI Study】第五天,Matplotlib(5)- 颜色映射

文章概要 本文详细介绍 Matplotlib 的颜色映射功能&#xff0c;包括&#xff1a; 颜色映射类型颜色映射设置数据标准化颜色条 颜色映射类型 pcolormesh import matplotlib.pyplot as plt import numpy as np# 创建网格数据 x np.linspace(-3, 3, 100) y np.linspace(-3,…

DB2中合理使用INCLUDE关键字创建索引

DB2中合理使用 INCLUDE 关键字创建索引 1. 为何还需要 INCLUDE&#xff1f;——从索引的两大痛点说起 查询想“只读索引不回表”&#xff0c;却又不想把列都做键 → 联合索引空间膨胀&#xff0c;更新放大。唯一索引定位快&#xff0c;但只能返回键列数据 → 仍需 I/O 跳回数据…

基于Spring Boot的民宿管理系统设计与实现

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅Spring Boot框架3. ✅Vue.js框架4. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 浏览后台首页1.2 预订信息管理1.3 入住信息管理1.4 退房信息管理1.…

大数据系统架构实践(一):Zookeeper集群部署

大数据系统架构实践&#xff08;一&#xff09;&#xff1a;Zookeeper集群部署 文章目录 大数据系统架构实践&#xff08;一&#xff09;&#xff1a;Zookeeper集群部署一、Zookeeper简介二、部署前准备三、部署Zookeeper集群1. 下载并解压安装包2. 配置zoo.cfg3. 设置日志目录…

《道德经》:探寻古老智慧中的哲学之光

我强烈推荐4本可以改变命运的经典著作&#xff1a; 《寿康宝鉴》在线阅读白话文《欲海回狂》在线阅读白话文《阴律无情》在线阅读白话文《了凡四训》在线阅读白话文 《道德经》作为道家经典&#xff0c;短短五千言&#xff0c;却字字珠玑&#xff0c;蕴含着超越时空的哲学智慧。…

科技赋能民生:中建海龙为民生改善注入新动力

在社会发展的进程中&#xff0c;民生改善始终占据着核心地位。住房、基础设施建设等民生领域的进步&#xff0c;直接关系到民众的生活质量与幸福感。中建海龙科技有限公司&#xff08;以下简称“中建海龙”&#xff09;作为建筑行业的创新引领者&#xff0c;凭借其强大的科技实…

BI 赋能,打造数据可视化看板新体验

BI 赋能&#xff0c;打造数据可视化看板新体验 引言 在当今数字化时代&#xff0c;数据成为企业决策的重要依据。如何从海量的数据中提取有价值的信息&#xff0c;并以直观、易懂的方式呈现出来&#xff0c;是企业面临的重要挑战。商业智能&#xff08;BI&#xff09;工具的出…

vue2设置自定义域名跳转

需求&#xff1a;首次登录域名为aa.com&#xff0c;之后登录系统后在系统内某个模块设置三级域名为second&#xff0c;之后退出登录到aa.com,登录进入系统后域名自动变为second.aa.com&#xff0c;最后退出的域名也是second.aa.com&#xff0c;通过不同的域名配置动态的登录页面…

“地标界爱马仕”再拓疆域:世酒中菜联袂赤水金钗石斛定义中国GI

“地标界爱马仕”再拓疆域&#xff1a;世酒中菜联袂赤水金钗石斛&#xff0c;定义中国GI奢侈品新高度 ——中世国际与贵州斛满多战略合作签约仪式在赤水举行 赤水市&#xff0c;2025年5月18日——被誉为“地标界爱马仕”的顶级奢侈品牌世酒中菜 &#xff08;世界酒中国菜全球…

零基础、大白话,Vue3全篇通俗疗法(上):基础知识【看得懂】

前言 最近有个小朋友想了解Vue前端技术&#xff0c;但他只懂一些HTML基础&#xff0c;让我用最简单的方式讲解。于是就有了这篇面向初学者的博文。 老手请绕行&#xff0c;本文专为新手准备。如果发现用词不当的地方欢迎留言指正&#xff0c;觉得对新手有帮助的话请收藏点赞。 …

JavaScript性能优化实战

JavaScript性能优化实战技术文章大纲 性能优化的重要性 解释为什么性能优化对用户体验和业务指标至关重要讨论核心Web指标&#xff08;LCP、FID、CLS&#xff09;与JavaScript性能的关系 代码层面优化 减少DOM操作&#xff0c;使用文档片段或虚拟DOM避免频繁的重绘和回流&a…

考研英语作文评分标准专业批改

考研英语作文专业批改经过官方评分标准严格对标&#xff0c;彻底改变你的作文提升方式&#xff0c;打开 懂试帝小程序 直达批改。 &#x1f3af; 批改服务核心优势 ✨ 官方标准严格对标 完全按照考研英语官方五档评分制&#xff0c;从内容完整性、组织连贯性、语言多样性到语…

智能群跃小助手发布说明

1.初次登陆需要授权码 2.社群维护页面 3.产品营销页面

SAM2论文解读-既实现了视频的分割一切,又比图像的分割一切SAM更快更好

code&#xff1a;https://github.com/facebookresearch/sam2/tree/main demo:https://sam2.metademolab.com/ paper:https://ai.meta.com/research/publications/sam-2-segment-anything-in-images-and-videos/ 这是SAM 这是SAM2 Facebook出品&#xff0c;继SAM在图像上分割…

WPF 的RenderTransform使图标旋转180°

只是记录一下思想&#xff1a; 本来想找两个对称的图标给按钮用&#xff0c;但是另一个找不到&#xff0c;就想到可不可以旋转180实现另一个图标的效果&#xff0c;问了一下DeepSeek&#xff1a; <Path Width"30" Height"30" Margin"1"Data…

Matplotlib 绘图库使用技巧介绍

目录 前言 Matplotlib 简介 快速入门 图形结构解剖 常用绘图函数 子图与布局 单行多列子图&#xff1a; 网格布局&#xff1a; 自定义位置&#xff1a; 样式与标注 中文字体与科学计数 图例、网格、坐标轴 动态图与动画 三维绘图 常见问题与技巧 前言 Matplotli…

【Java基础算法】1.相向指针练习

📘博客主页:程序员葵安 🫶感谢大家点赞👍🏻收藏⭐评论✍🏻 一、两数之和 Ⅱ(167) 1.1 题目介绍 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 nu…