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 中的文件,只说明生成了构件;外部容器能否加载、路径是否正确及接口是否可用,仍需独立验证。