找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3011

积分

0

好友

403

主题
发表于 昨天 12:46 | 查看: 6| 回复: 0

在进行SpringBoot项目部署时,你可能会遇到一个典型场景:用 mvn install 打包成jar后,换一台有JDK的机器直接 java -jar 就能运行;而打包成war放进Tomcat,端口号却变成了Tomcat默认的8080,项目路径也加上了应用名。

这究竟是为什么呢?

  1. 通过jar运行实际上是启动了SpringBoot内置的Tomcat,所以应用配置(如 server.port)生效。
  2. 将war包部署到外部Tomcat后,内置的Tomcat就不会启用,所有配置(端口、路径)都以外部Tomcat为准。

简单来说,jar包是“自带容器的可执行文件”,而war包是“需要放入容器的Web模块”。

JAR与WAR包的本质区别

为了更好地选择,我们需要理解两者的核心差异:

  1. 定义与结构

    • WAR:一个完整的Web应用程序模块,必须包含 WEB-INF 目录,其下应有 classes(编译后的类文件)和 lib(依赖JAR包)子目录。它是为Servlet容器(如Tomcat)设计的标准格式。
    • JAR:通常是一个包含类文件和资源文件的压缩包。当它声明了 Main-Class 后,可以用 java -jar 命令直接运行。在Spring Boot项目中,它通过内嵌容器实现了自执行。
  2. 用途与场景

    • WAR:传统Web项目开发完成后,打包部署到独立的Servlet容器中。
    • JAR:常用于打包通用类库供其他项目引用。在SpringBoot的微服务理念下,“Use Jar, Not War”成为主流,JAR包因其独立性而成为服务化部署的首选。
  3. 格式特点 (JAR)

    • 安全性:支持数字签名,用于验证代码来源和完整性。
    • 高效传输:对于Applet,浏览器可通过一个HTTP事务下载所有相关资源。
    • 压缩:采用ZIP格式,节省存储空间。
    • 可扩展性:Java扩展框架(Java Extension Framework)使用JAR文件来添加平台功能。

如何将SpringBoot项目打包成JAR

打包成JAR是SpringBoot的默认方式,也是推荐的方式,步骤非常简单。

1. 创建项目
在创建SpringBoot项目时,注意 Packaging 选项默认为 Jar,无需修改。

Spring Initializr创建项目,Packaging选择Jar

2. 项目POM文件
一个标准的SpringBoot JAR项目 pom.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

关键<packaging> 标签默认为 jar,并且必须有 spring-boot-maven-plugin 插件。

3. 执行打包命令
在项目根目录下,打开终端执行Maven命令:

mvn clean package

IDEA中执行mvn clean package命令

4. 获取JAR包
命令执行成功后,在 target 目录下即可找到打包生成的 demo-0.0.1-SNAPSHOT.jar 文件。

target目录下生成的JAR文件

使用 java -jar target/demo-0.0.1-SNAPSHOT.jar 即可启动应用。

如何将SpringBoot项目打包成WAR

如果你需要将应用部署到已有的Tomcat、WebLogic等Servlet容器,或者需要与一些传统架构集成,则需要打包成WAR。

1. 继承 SpringBootServletInitializer
这是使SpringBoot应用支持WAR部署的关键。你需要创建一个 ServletInitializer 类(或修改主启动类),让它继承 SpringBootServletInitializer

package com.example.demo;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        // 指向原有的SpringBoot主启动类
        return application.sources(DemoApplication.class);
    }
}

ServletInitializer类代码示例

注意:如果你在创建项目时直接选择了 PackagingWar,IDEA或Spring Initializr会自动生成这个类。

2. 修改POM文件
将打包方式改为 war,并修改相关依赖。

<!-- 1. 修改打包方式 -->
<packaging>war</packaging>

<!-- 2. 在依赖中,将内嵌Tomcat的scope设为provided -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- 排除内嵌Tomcat,或将其scope设为provided -->
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope> <!-- 关键:容器会提供此依赖 -->
    </dependency>
    <!-- 其他依赖 -->
</dependencies>

关键点spring-boot-starter-tomcat<scope> 必须设置为 provided,这表示该依赖在打包时会被包含,但在运行时由外部容器(如你安装的Tomcat)提供,从而避免与外部容器的Tomcat发生冲突。

3. 执行打包命令
同样使用Maven命令打包:

mvn clean package

打包WAR成功后的控制台输出

4. 部署WAR包
打包成功后,在 target 目录下会生成 demo-0.0.1-SNAPSHOT.war 文件。将其复制到外部Tomcat的 webapps 目录下,启动Tomcat,Tomcat会自动解压并部署该应用。访问地址将变为 http://服务器IP:Tomcat端口/项目名/你的接口

总结与选择建议

  • JAR包(推荐用于微服务/独立应用)
    • 优点:简单、独立、便于容器化(Docker)。应用配置完全自主,部署命令统一(java -jar)。
    • 缺点:每个应用自带容器,可能占用更多内存(多个应用多个容器实例)。
  • WAR包(适用于传统环境/特定需求)
    • 优点:符合传统Java Web部署习惯,方便在单个Tomcat中管理多个应用。
    • 缺点:依赖外部容器,配置受容器影响,部署步骤稍多,不符合云原生趋势。

在当今以云原生和微服务为主流的开发环境中,SpringBoot项目默认并推荐使用JAR包进行打包部署。它简化了部署流程,让应用成为自包含的独立单元,非常适合CI/CD流水线和容器化部署。

然而,在面对遗留系统、企业特定规范或需要使用JSP等传统视图技术(虽然SpringBoot不推荐)的面试场景时,理解并掌握WAR包的打包方式依然是一项有价值的技能。希望这篇对比与实践指南能帮助你根据实际需求做出合适的选择。




上一篇:Spring Boot项目代码混淆实战:使用ProGuard保护你的Java应用
下一篇:SpringBoot拦截器实战:从登录校验到统一返回格式的完整解决方案
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-7 18:03 , Processed in 0.804226 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表