2018 年在 Eclipse 中把 Spring Boot 项目打成 WAR 时,遇到过:

Perhaps you are running on a JRE rather than a JDK?

当时把相关运行配置的 JRE home 指向 JDK 后完成了打包。关键不是目录名称,而是实际执行 Maven 的环境是否具备编译能力。

核对实际构建入口

命令行中可以检查:

java -version
mvn -version

Eclipse 自身使用的 Java、项目 JRE System Library 与 Maven Run Configuration 中选择的 Java,可能不同。应查看失败的那次 Maven 输出和运行配置,而不能只凭系统 JAVA_HOME 推断。

工具链配置还可能指定另外的编译器,因此也要检查 pom 和 Maven toolchains。不要为了消除提示就随意增加不相关的 Maven 系统属性。

WAR 配置要和 Spring Boot 版本配套

下面以 Spring Boot 2.7.x 的传统 Servlet 部署为例,不是对当年缺失工程的逐字还原。pom 中使用 WAR packaging,并将嵌入式容器依赖标记为 provided:

<packaging>war</packaging>

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

该片段省略了已有的 Boot 父 POM 或依赖管理。入口类示意:

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
public class WebApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder builder) {
        return builder.sources(WebApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
}

注解和相关类型分别来自 Spring Boot 对应包。容器、Java 和 Servlet 版本仍需匹配;不同大版本不能直接照搬。Spring Boot 2.7.18 传统部署说明

产生构件不等于部署成功

正常打包命令为:

mvn clean package

它会清理旧构建输出,应在自己的工程和正常版本管理下执行。不要为了看见 WAR 就默认跳过测试。看到 target 中的文件,只说明生成了构件;外部容器能否加载、路径是否正确及接口是否可用,仍需独立验证。