You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一WAR包在不同环境切换Spring Profiles的Maven构建方案

Maven构建Spring Boot WAR包:解决占位符未解析问题并实现多环境切换

问题描述

执行mvn install构建Spring Boot WAR包时,抛出如下错误:

java.lang.IllegalArgumentException: Could not resolve placeholder 'example_token' in value "${example_token}"

原因是example_token仅在application-dev.yml和application-prod.yml中定义,主配置文件application.yml未包含该属性。需求是构建单个WAR包,通过环境变量SPRING_PROFILES_ACTIVE=dev或SPRING_PROFILES_ACTIVE=prod在运行时切换Spring环境,本地IDEA指定profile运行应用正常,使用版本为Spring Boot 3.0.13、Maven 3.9.5。

问题根源

Maven执行install阶段时,默认会触发测试相关流程,即使项目中没有测试代码,也会尝试初始化Spring上下文。此时未激活任何Spring profile,Spring仅加载application.yml,导致其中缺失的环境专属占位符无法解析,从而抛出错误。

解决方案

在构建命令中显式添加跳过测试的参数:

  • 本地构建命令:
    mvn install -DskipTests
    
  • CI流水线构建命令(推荐加上clean确保干净构建):
    mvn clean install -DskipTests
    

最佳构建实践(多环境单WAR包)

1. 保持配置文件结构规范

  • application.yml:仅存放所有环境共享的配置,不定义环境专属属性(如example_token)
  • application-dev.yml:dev环境专属配置,包含该环境的example_token等属性
  • application-prod.yml:prod环境专属配置,包含该环境的example_token等属性

2. 构建阶段隔离Spring上下文

  • 始终在mvn install命令中添加-DskipTests,避免Maven触发Spring上下文初始化流程,彻底规避占位符未解析问题
  • 若后续添加测试代码,可根据需求选择:
    • -DskipTests:跳过测试执行,但仍编译测试代码
    • -Dmaven.test.skip=true:完全跳过测试代码的编译和执行

3. 运行时灵活切换环境

部署WAR包时,通过以下方式激活指定环境:

  • 环境变量方式:
    # Linux/Unix系统
    export SPRING_PROFILES_ACTIVE=dev
    java -jar your-application.war
    
    # Windows系统
    set SPRING_PROFILES_ACTIVE=prod
    java -jar your-application.war
    
  • 启动参数方式:
    java -jar your-application.war --spring.profiles.active=dev
    

4. 避免绑定Maven Profiles与Spring Boot Profiles

无需在pom.xml中配置Maven Profiles来关联Spring环境,因为目标是构建单个WAR包,运行时通过变量切换环境更灵活,可避免构建多个环境专属包的冗余工作。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:33:26