JAR包和WAR包区别

200 阅读2分钟

科普版解释(小白友好):

JAR包WAR包就像是两种不同用途的“工具箱”:

  1. JAR包(Java Archive)

    • 定位:通用型工具箱
    • 用途:装Java程序、代码库或独立应用(比如桌面小工具)
    • 特点:自带“发动机”(如Spring Boot内嵌Tomcat),可以直接运行
    • 举个栗子:你下载一个 .jar 文件,双击就能运行一个游戏,不需要额外安装服务器。
  2. WAR包(Web Application Archive)

    • 定位:专用型厨房工具箱
    • 用途:专门装Web应用(比如网站后台),必须放在“厨房”(如Tomcat服务器)才能用
    • 特点:需要外接“煤气灶”(服务器),不能独立运行
    • 举个栗子:你把 .war 文件丢进Tomcat的“厨房”,才能通过浏览器访问网站。

一句话总结

  • JAR包 = 便携工具箱(自带动力)
  • WAR包 = 厨房专用工具箱(依赖外部设备)

专业版解释(开发者视角):

1. 本质区别

维度JAR包WAR包
标准定义Java标准打包格式(JSR-277/JSR-294)Java Web应用标准格式(J2EE规范)
文件结构包含META-INF/MANIFEST.MF(定义主类/依赖)包含WEB-INF目录(web.xml/classes/lib等)
运行方式可执行JAR通过java -jar启动(含内嵌服务器)需部署到Servlet容器(如Tomcat/Jetty)
适用场景普通Java应用/库/Spring Boot独立应用传统J2EE Web应用(如Spring MVC非Boot项目)

2. 技术细节对比

  • 依赖管理

    • JAR:通过MANIFEST.MFClass-Path声明依赖路径
    • WAR:依赖统一放在WEB-INF/lib目录,容器自动加载
  • 资源加载

    • JAR:使用ClassLoader.getResource()加载类路径资源
    • WAR:通过ServletContext获取/WEB-INF/resources下的资源
  • 部署差异(以Spring Boot为例)

    // Spring Boot生成可执行JAR的核心配置
    <build>
      <plugins>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <configuration>
            <executable>true</executable> <!-- 支持直接./app.jar运行 -->
          </configuration>
        </plugin>
      </plugins>
    </build>
    

    WAR包需额外配置:

    // Spring Boot生成WAR需修改启动类
    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(Application.class);
        }
    }
    

3. 性能与扩展性

  • JAR优势

    • 启动速度快(内嵌容器无解压过程)
    • 内存占用优化(Spring Boot 2.4+的分层JAR技术)
  • WAR优势

    • 支持热部署(修改文件后容器自动重加载)
    • 多应用共享容器资源(适合企业级环境)

4. 选择建议

  • 用JAR:微服务架构/云原生部署(K8s/Docker)
  • 用WAR:遗留系统迁移/需与PHP/.NET应用共享Tomcat

终极结论:

JAR是自给自足的独立应用WAR是依赖容器的Web模块。现代Spring Boot优先选JAR,传统企业级Web项目可能仍需WAR。