1. 概述

Spring Boot 默认在根上下文路径("/")提供服务。

虽然通常建议优先使用约定而非配置,但在某些场景下我们确实需要自定义路径。

这篇简短教程将介绍几种不同的配置方法。

2. 设置属性

与其他配置选项类似,Spring Boot 的上下文路径可以通过设置 server.servlet.context-path 属性来修改。

⚠️ 注意:这适用于 Spring Boot 2.x。对于 Boot 1.x,属性名是 server.context-path

有多种方式设置该属性,我们逐一介绍。

2.1. 使用 application.properties / yml

最直接的方式是在 application.properties/yml 文件中设置属性:

server.servlet.context-path=/baeldung

除了将属性文件放在 src/main/resources,也可以放在当前工作目录(classpath 外)。

2.2. Java 系统属性

我们还可以在上下文初始化前通过 Java 系统属性设置:

public static void main(String[] args) {
    System.setProperty("server.servlet.context-path", "/baeldung");
    SpringApplication.run(Application.class, args);
}

2.3. 操作系统环境变量

Spring Boot 也支持读取操作系统环境变量。在 Unix 系统中:

$ export SERVER_SERVLET_CONTEXT_PATH=/baeldung

在 Windows 系统中:

> set SERVER_SERVLET_CONTEXT_PATH=/baeldung

⚠️ 上述环境变量适用于 Spring Boot 2.x.x。如果是 1.x.x 版本,变量名应为 SERVER_CONTEXT_PATH

2.4. 命令行参数

也可以通过命令行参数动态设置:

$ java -jar app.jar --server.servlet.context-path=/baeldung

3. 使用 Java 配置

现在我们通过配置 bean 来设置上下文路径。

在 Spring Boot 2 中,可以使用 WebServerFactoryCustomizer

@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
  webServerFactoryCustomizer() {
    return factory -> factory.setContextPath("/baeldung");
}

在 Spring Boot 1 中,需要创建 EmbeddedServletContainerCustomizer 实例:

@Bean
public EmbeddedServletContainerCustomizer
  embeddedServletContainerCustomizer() {
    return container -> container.setContextPath("/baeldung");
}

4. 配置优先级顺序

面对这么多选项,可能会出现同一属性被多次配置的情况。

以下是 Spring Boot 选择有效配置的优先级顺序(从高到低)

  1. Java 配置
  2. 命令行参数
  3. Java 系统属性
  4. 操作系统环境变量
  5. 当前目录下的 application.properties
  6. classpath 中的 application.propertiessrc/main/resources 或打包后的 jar 文件)

5. 总结

这篇简短文章介绍了在 Spring Boot 应用中设置上下文路径(或其他配置属性)的多种方法。

✅ 关键点总结:

  • 属性配置最简单(properties/yml)
  • 环境变量适合容器化部署
  • Java 配置提供最大灵活性
  • 优先级顺序避免配置冲突

原始标题:Spring Boot Change Context Path