ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Tomcat的jar包和war包对比

Tomcat的jar包和war包对比 问题发现在大学学习中老师推荐使用tomcat war包模式上机时发现电脑没有tomcat软件嫌麻烦所以推荐一下配置环境要求低不需要额外下载tomcat的jar包模式。Tomcat 是 Java Web 应用的 Servlet 容器负责接收 HTTP 请求、调度线程、管理 Servlet 生命周期、返回响应。它既是传统 Web 应用的外部容器也是 Spring Boot 微服务的内嵌组件一、war包和jar包对比war包将应用打为war包放入预先安装的独立tomcat容器中。jar 包Spring Boot 默认方法将 Tomcat 作为应用一部分打包进 JAR形成一个可独立运行、可快速部署、可水平扩展的微服务单元。WAR 包必须放在 Servlet 容器中才能运行而 JAR 在 Spring Boot 内嵌容器模式下可以独立启动。内嵌 TomcatJar 包模式Spring Boot 默认方式将 Tomcat 作为应用的一部分打包进 Jar包。优点极致的独立性与隔离每个微服务拥有独立进程和 JVM单个服务内存溢出或崩溃不会波及其他服务。简化部署与扩展仅需 Java 环境即可 java -jar 运行天然适配 Docker 与 K8s启动快且便于自动化扩容。开发运维统一配置全在 application.yml 中无需单独安装维护 Tomcat。缺点· 资源开销每个服务都包含一份 Tomcat 代码基础内存占用相对较高有测试显示约高出独立模式 16%。· 全局管理弱无法像独立 Tomcat 那样通过统一的 Manager 界面集中监控所有应用会话或一键重部署。外部独立 TomcatWar 包模式剔除内嵌 Tomcat将应用打为 War 包放入预先安装的独立 Tomcat 容器。优点集中管控利用 Tomcat Manager 界面统一部署、监控且能共享 JVM 内存和连接池减少重复加载的类。精细调优运维可直接修改 server.xml 调整线程池、AJP 协议或安全策略适合有专门中间件团队的企业。缺点破坏微服务隔离性多个微服务挤在同一 JVM 中一个应用内存泄漏可能导致整个 Tomcat 崩溃所有服务一起挂掉。部署繁琐且耦合需处理 War 包依赖冲突且与云原生容器化流程Docker/K8s的契合度较低显得比较陈旧。选型建议如果你是做全新的微服务或云原生项目优先选内嵌 Tomcat配合 Docker 部署最省心。除非公司有遗留的独立 Tomcat 集群需要复用或者是纯粹为了满足运维部门的传统管理习惯才考虑 War 包模式二、Tomcat的jar包模式Spring Boot 内嵌 Tomcat 的 JAR是微服务的“标准集装箱”——它让每个服务能独立跑、独立部署、独立扩展且不需要额外安装 Tomcat。它内置了多线程请求处理能力但真正要支撑高并发还需要合理配置线程池、JVM、数据库、缓存并配合注册中心、网关、配置中心、容器编排等外层基础设施。第一步打包成 JAR确保pom.xml中有 Spring Boot 的打包插件通常默认就有!-- 父项目统一管理 Spring Boot 版本不要删 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version relativePath/ /parent !-- 项目坐标按你自己的项目改 -- groupIdcom.example/groupId artifactIdmy-app/artifactId version0.0.1-SNAPSHOT/version packagingjar/packaging !-- -- !-- 第一部分依赖写在 dependencies 里 -- !-- 作用应用编译/运行需要哪些库 -- !-- -- dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId !-- 默认带内嵌 Tomcat不用再单独写 -- /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies !-- -- !-- 第二部分构建插件写在 build 里 -- !-- 作用打包时打成可执行 JAR -- !-- -- build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project然后在项目根目录执行 Maven 命令mvn clean package打包完成后JAR 文件会生成在target/目录下名字类似 your-app-0.0.1-SNAPSHOT.jar第二步运行 JARjava -jar your-app.jar三、jar包应用扩展引入 Nginx 和 Docker在微服务架构中使用 Spring Boot 内嵌 Tomcat 的 JAR 作为微服务运行单元配合 Nginx 反向代理作为流量入口再用 Docker 封装运行环境即可实现一套完整的 Web 服务器接收 HTTP 请求、返回响应不需要额外安装 Tomcat并具备多并发多线程处理能力。项目文件夹结构my-project/ ├── pom.xml # Maven 配置 ├── Dockerfile # 【Docker 用】镜像构建脚本 ├── docker-compose.yml # 【Docker 用】一键启动 ├── src/ │ └── main/ │ ├── java/ │ │ └── com/example/ │ │ └── DemoApplication.java │ └── resources/ │ └── application.yml # 【JAR 用】应用配置 ├── nginx/ │ └── nginx.conf # 【Nginx 用】反向代理配置 ├── frontend/ │ └── dist/ # 【Nginx 用】前端打包产物 └── target/ └── my-app-0.0.1-SNAPSHOT.jar # 打包后生成 运行流程图 [ 用户浏览器 ] | | HTTP 请求 (http://localhost/) v --------------------------------------------- | Nginx 容器 | | (监听 80 端口容器名 my-nginx) | | | | 判断请求类型 | | ├── 静态资源 (/、/css、/js) | | │ └── 直接返回 frontend/dist 文件 | | │ | | └── 动态请求 (/api/**) | | └── 转发给 upstream backend | --------------------------------------------- | | proxy_pass http://app:8080 v --------------------------------------------- | App 容器 | | (Spring Boot JAR 内嵌 Tomcat) | | (监听 8080 端口容器名 my-app) | | | | 1. 接收 HttpServletRequest | | 2. 调用 Controller 业务逻辑 | | 3. 访问数据库 / 缓存 | | 4. 返回 HttpServletResponse | --------------------------------------------- | | 返回 JSON 数据 v [ Nginx 原路返回给浏览器 ] Docker 网络 app-net 把两个容器连在一起 Nginx 通过服务名 app 访问后端无需知道 IP。 四层协作关系用户 │ ▼ ┌─────────────────────────────────────┐ │ Nginx流量入口层 │ │ · 反向代理 │ │ · 负载均衡 │ │ · 静态资源 │ │ · SSL 卸载 │ └─────────────────────────────────────┘ │ 分发请求 ▼ ┌─────────────────────────────────────┐ │ Docker运行隔离层 │ │ ┌───────────┐ ┌───────────┐ │ │ │ 容器1 │ │ 容器2 │ ... │ │ │ JAR JDK │ │ JAR JDK │ │ │ │ 内嵌Tomcat│ │ 内嵌Tomcat│ │ │ └───────────┘ └───────────┘ │ │ · 环境一致 · 进程隔离 │ │ · 快速复制 · 编排基础 │ └─────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ Spring Boot JAR业务处理层 │ │ · Controller / Service / DAO │ │ · 访问数据库、缓存、消息队列 │ └─────────────────────────────────────┘
返回列表