You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多模块Maven项目(含Spring Boot模块)构建War包技术咨询

多模块Spring Boot项目构建Module-Web War包实操指南

我来帮你搞定这个多模块Spring Boot项目打War包的事儿,一步步来,保证清晰靠谱:

一、先确认父项目POM的基础配置

首先得确保你的无代码父项目pom.xml已经正确挂了Spring Boot的父依赖,并且声明了所有子模块。给你个参考配置:

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 挂Spring Boot官方父依赖,统一管理版本 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.15</version> <!-- 换成你实际用的Spring Boot版本 -->
        <relativePath/>
    </parent>
    
    <groupId>com.yourcompany</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging> <!-- 父项目必须是pom打包类型 -->
    
    <!-- 把三个子模块都声明进来 -->
    <modules>
        <module>Module-Data</module>
        <module>Module-Domain</module>
        <module>Module-Web</module>
    </modules>
    
    <!-- 可选:统一管理子模块的依赖版本,避免每个模块重复写版本号 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.yourcompany</groupId>
                <artifactId>Module-Data</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>com.yourcompany</groupId>
                <artifactId>Module-Domain</artifactId>
                <version>${project.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

二、重点调整Module-Web的配置

要生成可部署的War包,Module-Web的pom和启动类得改三处:

1. 修改打包类型为War

在Module-Web的pom.xml里,把<packaging>改成war

<packaging>war</packaging>

2. 调整Web依赖,适配外部容器

如果要把War包部署到外部Tomcat/Jetty这类容器,得排除Spring Boot内置的Tomcat,再添上Servlet API的提供依赖(不会被打包进War,避免和容器冲突):

<dependencies>
    <!-- Web核心依赖,排除内置Tomcat -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <!-- Servlet API,用provided范围,容器会提供 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    
    <!-- 引入其他两个子模块的依赖 -->
    <dependency>
        <groupId>com.yourcompany</groupId>
        <artifactId>Module-Domain</artifactId>
    </dependency>
    <dependency>
        <groupId>com.yourcompany</groupId>
        <artifactId>Module-Data</artifactId>
    </dependency>
</dependencies>

要是你想让War包既能部署到外部容器,又能直接用java -jar运行,那可以不用排除内置Tomcat,上面的配置改成保留Tomcat就行,不影响War包生成。

3. 修改启动类,让外部容器能识别

Module-Web的启动类得继承SpringBootServletInitializer,并重写configure方法,这样外部容器启动时才能正确初始化Spring Boot应用:

package com.yourcompany.moduleweb;

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

@SpringBootApplication(scanBasePackages = "com.yourcompany") // 这里要扫到所有模块的包哦
public class ModuleWebApplication extends SpringBootServletInitializer {

    // 保留原有的main方法,方便本地运行测试
    public static void main(String[] args) {
        SpringApplication.run(ModuleWebApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ModuleWebApplication.class);
    }
}

三、执行构建命令生成War包

回到父项目的根目录,打开终端执行下面的Maven命令:

mvn clean package -DskipTests

等构建完成,War包就会出现在Module-Web/target目录下,名字大概是Module-Web-1.0.0-SNAPSHOT.war(取决于你设置的版本号)。

四、验证War包是否可用

  • 直接运行测试:如果没排除内置Tomcat,直接用这个命令就能启动:
    java -jar Module-Web-1.0.0-SNAPSHOT.war
    
  • 部署到外部容器:把War包复制到Tomcat的webapps目录,启动Tomcat,它会自动解压部署,之后就能通过容器的端口访问你的应用了。

内容的提问来源于stack exchange,提问作者Mario Dennis

火山引擎 最新活动