Jar 包 vs War 包 核心区别与常用包类型
一、基础定义与底层本质JarJava Archive和 WarWeb Application Archive都是基于 JDKjar命令实现的Java 归档压缩包本质都是 ZIP 格式核心区别是打包目的、内部结构、运行场景完全不同。二、核心差异对比1. 内部结构差异Jar 包结构核心META-INF/MANIFEST.MF清单文件定义主程序入口类内容仅包含项目自身代码、编译后的 class 文件、资源文件可包含第三方依赖 jar无强制目录结构是通用的纯 Java 程序归档包plaintextyour-project.jar ├── com/your/package/ (class文件) ├── resources/ (配置文件) └── META-INF/ └── MANIFEST.MF (定义主类JVM启动入口)War 包结构核心必须遵循 Servlet 规范有固定的 Web 应用目录结构必须包含WEB-INF/目录存放 class、lib、web.xml 等 Web 容器需要的配置专门用于 Java Web 应用必须部署到 Servlet 容器Tomcat/Jetty运行plaintextyour-project.war ├── WEB-INF/ │ ├── classes/ (项目class文件) │ ├── lib/ (第三方依赖jar) │ └── web.xml (Web应用部署描述符) ├── static/ (静态资源html/js/css) └── index.html (首页)2. 核心区别总表表格对比维度Jar 包War 包核心用途通用 Java 程序归档可执行程序、工具类、依赖包专门用于 Java Web 应用部署运行方式① 可执行 Jarjava -jar xxx.jar直接启动内置运行环境② 依赖 Jar作为第三方库被其他项目引用必须部署到外置 Servlet 容器Tomcat/Jetty容器启动后加载运行容器依赖可内置 Tomcat/Jetty无需外置容器独立运行强制依赖外置 Web 容器本身无法独立启动结构规范无强制目录结构仅需 MANIFEST.MF 定义主类强制遵循 Servlet 规范必须有 WEB-INF 目录和 web.xmlSpringBoot 支持主流默认打包方式完美适配云原生、Docker 部署支持需手动配置适配传统外置 Tomcat 部署场景适用场景所有 Java 程序SpringBoot 项目、工具类、依赖库、微服务传统 SSM/Web 项目、需部署到外置 Tomcat 的场景文件大小可执行 Jar 会打包所有依赖体积较大瘦 Jar 仅打包自身代码依赖可放在容器 lib 目录War 包体积可更小3. 关键细节补充War 包的 web.xml传统 Web 项目必须通过 web.xml 配置 Servlet、Filter、ListenerSpringBoot3 已废弃 web.xml推荐用注解配置Jar 包的 MANIFEST.MF可执行 Jar 必须在清单文件中指定Main-ClassJVM 才能找到程序入口SpringBoot 的内置容器SpringBoot 打包 Jar 时会自动内嵌 Tomcat/Jetty把容器和项目一起打包实现 开箱即用。三、我们常用的包类型SpringBoot 项目为主1. 可执行 Jar 包SpringBoot 90% 场景首选1Fat Jar完整可执行 Jar默认方式特点把项目自身代码 所有第三方依赖 内置 Tomcat全部打包到一个 Jar 包中优势部署极简仅需java -jar xxx.jar即可启动无需额外配置容器、依赖适用场景Docker 部署、云服务器部署、微服务、独立 SpringBoot 项目打包配置Mavenxmlpackagingjar/packaging !-- SpringBoot Maven插件自动打包Fat Jar -- build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build2Skinny Jar瘦 Jar多环境部署场景特点仅打包项目自身代码不打包第三方依赖依赖包统一放在服务器指定目录优势减少重复上传依赖包多项目部署时节省磁盘空间更新项目代码无需重新上传所有依赖启动方式java -jar -Dloader.path/path/to/lib xxx.jar适用场景多项目共用依赖、服务器带宽有限、频繁迭代部署的场景。2. War 包传统场景使用1标准 War 包特点遵循 Servlet 规范打包为 War 包部署到外置 Tomcat 的webapps目录适用场景传统 SSM 项目迁移原有部署架构是外置 Tomcat服务器已统一部署 Tomcat 集群所有 Web 应用统一管理需适配老旧 Web 容器SpringBoot 内置容器不兼容的场景。SpringBoot 打包 War 配置xmlpackagingwar/packaging !-- 排除内置Tomcat避免和外置容器冲突 -- build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclude /excludes /configuration /plugin /plugins /build2可执行 War 包特点既可以java -jar xxx.war直接启动内置容器也可以部署到外置 Tomcat 运行适用场景需要同时支持两种部署方式的项目兼顾本地开发直接启动和生产外置容器部署。3. 其他常用包类型表格包类型用途Jar-with-dependenciesMaven 打包时把所有依赖和项目代码打包到一个 Jar 中类似 Fat JarSource Jar源码包包含项目 Java 源码用于调试、开源项目发布Doc Jar文档包包含项目 JavaDoc 注释用于开发参考Executable Jar带执行权限的 Jar 包Linux 下可直接./xxx.jar启动无需 java -jar四、怎么选择电商项目实战场景1. 优先选 Jar 包的场景99% 现代项目SpringBoot 微服务、单体项目Docker 容器化部署、云服务器部署前后端分离项目仅需后端独立运行快速迭代、一键部署、无需复杂容器配置的场景。2. 选 War 包的场景传统 SSM 旧项目改造原有架构是外置 Tomcat 集群企业内部统一运维规范所有 Web 应用必须部署到统一 Tomcat 容器需适配老旧 Servlet 容器SpringBoot 内置容器不兼容的场景。3. 避坑提醒SpringBoot3 已完全废弃 web.xmlWar 包部署也需要用注解配置 Servlet不要沿用旧 web.xml 写法外置 Tomcat 部署 War 包时必须排除内置 Tomcat 依赖否则会出现容器冲突可执行 Jar 包不要解压运行会破坏内置的依赖结构直接java -jar启动即可。