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)。
  • 构建流程:cleaninstall 自动编译、打包,适合复杂聚合项目。
  • 依次为每个部分添加本地tomcat-server

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

这里添加相应的

点击apply ->ok 运行tomcat

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

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

(4)配置server.xml文件

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

XML 复制代码
<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.jarWEB-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 Descriptorsweb.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文件

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端口不要冲突)
XML 复制代码
 <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 项目 :需手动配置依赖和结构,适合简单场景或旧项目,重点关注 FacetsArtifacts 配置。

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

相关推荐
kgcc2 小时前
Nginx+Tomcat负载均衡群集
nginx·tomcat·负载均衡
OKUNP2 小时前
Nginx+Tomcat负载均衡群集
nginx·tomcat·负载均衡
superkcl20223 小时前
【JAVA】【Stream流】
java·windows·python
mldong3 小时前
mldong 快速开发框架登录模块设计与实现
java·后端·架构
bulucc3 小时前
Maven 或 Gradle 下载和添加 jar 文件的步骤
java·maven·jar
我爱Jack3 小时前
@annotation:Spring AOP 的“精准定位器“
java·后端·spring
一ge科研小菜鸡4 小时前
编程语言的演化与选择:技术浪潮中的理性决策
java·c语言·python
我崽不熬夜4 小时前
为什么你该立即学习 Java 的 Lambda 表达式?
java·后端·java ee
wsdchong之小马过河4 小时前
2025虚幻引擎文件与文件夹命名规律
java·数据库·虚幻
幸运的大号暖贴4 小时前
单点登录进阶:基于芋道(yudao)授权码模式的单点登录流程、代码实现与安全设计
java·安全