详细分析 `@@` 和 `${}` 的来源及启动配置

详细分析 @@ 和 ${} 的来源及启动配置

yaml 复制代码
server:
  port: 9108
spring:
  application:
    name: @artifactId@
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_HOST:192.168.1.46}:${NACOS_PORT:8848}
        username: nacos
        password: nacos
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yml
        namespace: @nacos.namespace@
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
        username: ${spring.cloud.nacos.discovery.username}
        password: ${spring.cloud.nacos.discovery.password}
  profiles:
    active: @profiles.active@
​
xml 复制代码
 <profiles>
        <!--使用 mvn clean package -Pprod 进行激活prod环境的配置,否则激活默认环境-->
        <profile>
            <id>dev</id>
            <properties>
                <!-- 环境标识,需要与配置文件的名称相对应 -->
                <profiles.active>dev</profiles.active>
                <!--https://github.com/alibaba/nacos/issues/3460  默认的命名空间不要去设置namespace -->
                <nacos.namespace/>
            </properties>
            <activation>
                <!-- 默认环境 -->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
                <nacos.namespace>x</nacos.namespace>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
                <nacos.namespace>x</nacos.namespace>
            </properties>
        </profile>
    </profiles>
</project>
 <groupId>com.mall4j.cloud</groupId>
    <artifactId>mall4cloud</artifactId>
    <version>1.0-SNAPSHOT</version>

1. @@ 符号的来源及作用

  • 来源 :@@ 是 Maven 资源过滤 的占位符,用于在构建时替换 pom.xml 中定义的属性值。
  • 作用 :在 pom.xml 的 <profiles> 配置中,定义了不同环境(dev/test/prod)的属性(如 profiles.active 和 nacos.namespace)。当使用 mvn package -P{profile} 打包时,Maven 会将这些属性替换到配置文件(如 application.yml)中对应的 @属性名@ 位置。
    • 示例 :
      • @artifactId@ 会被替换为项目的 artifactId(即 Maven 工程的唯一标识)。
      • @profiles.active@ 会被替换为 <profile> 中定义的 <profiles.active> 值(如 dev/test/prod)。

2. ${} 符号的来源及作用

  • 来源 :${} 是 Spring 的占位符,用于运行时动态替换配置值。
  • 作用 :Spring 支持从环境变量、命令行参数、配置文件等来源读取值。例如:
    • ${NACOS_HOST:192.168.1.46} 表示优先使用环境变量 NACOS_HOST,若未设置则使用默认值 192.168.1.46。
    • ${spring.cloud.nacos.discovery.server-addr} 表示引用同一配置文件中的其他属性值。

项目启动时的配置说明

1. 构建时的 Maven 命令

  • 指定环境 Profile :通过 -P 参数选择环境(dev/test/prod)。

    bash 复制代码
    # 开发环境(默认)
    mvn clean package -Pdev
    
    # 测试环境
    mvn clean package -Ptest
    
    # 生产环境
    mvn clean package -Pprod
    • 效果 :
      • @profiles.active@ 会被替换为 dev/test/prod。
      • @nacos.namespace@ 会根据 <profile> 配置替换(如 test 和 prod 环境替换为 x,dev 环境为空)。

2. 运行时的启动命令

  • 基础命令 :运行打包生成的 JAR 文件。

    bash 复制代码
    java -jar target/your-app.jar
  • 覆盖配置(可选) :通过命令行参数或环境变量覆盖默认值。

    • 覆盖 Nacos 地址 :

      bash 复制代码
      java -jar target/your-app.jar --NACOS_HOST=192.168.1.50 --NACOS_PORT=8849

      或使用环境变量:

      bash 复制代码
      export NACOS_HOST=192.168.1.50
      export NACOS_PORT=8849
      java -jar target/your-app.jar
    • 强制激活 Spring Profile (仅在配置允许覆盖时有效):

      bash 复制代码
      java -jar target/your-app.jar --spring.profiles.active=test

关键配置说明表

配置项 来源 作用
@artifactId@ Maven 资源过滤 替换为项目的 artifactId(如工程名 user-service)。
@profiles.active@ Maven Profile 属性 根据 -P 参数替换为 dev/test/prod,决定激活的 Spring 环境。
@nacos.namespace@ Maven Profile 属性 在 test/prod 环境替换为 x,dev 环境为空(使用默认命名空间)。
${NACOS_HOST:192.168.1.46} Spring 占位符 运行时读取环境变量 NACOS_HOST,未设置则用默认值 192.168.1.46。
${spring.cloud.nacos.discovery...} Spring 属性引用 引用同一配置文件中其他属性的值(如 server-addr)。

注意事项

  1. 命名空间冲突 :根据 Nacos 的规范,默认命名空间(public)无需配置 namespace 字段。在 dev 环境中,namespace 为空,表示使用默认命名空间。
  2. 环境隔离 :test 和 prod 环境的 namespace 设置为 x(示例值),实际使用时应替换为真实的命名空间 ID。
  3. 配置优先级:命令行参数 > 环境变量 > 配置文件默认值。优先使用运行时动态配置,避免频繁重新打包。

通过以上配置和命令,可以实现多环境(开发、测试、生产)的灵活切换和动态参数覆盖。

相关推荐
JavaGuide31 分钟前
DeepSeek Harness 重磅更新,Codex、Claude Code 子智能体进官方插件列表了,还有 Git 工作树和思考翻译!
前端·后端
Rain的Java大神之路1 小时前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
高频因子挖掘机1 小时前
A股分钟K线数据占内存:先缩小请求范围,还是换 DataFrame 工具?
后端·github·api
高级程序源1 小时前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
打工仔折腾 AI1 小时前
极空间用 Docker 部署 Photopea:网页版 PS 的私有化实践
运维·后端·python·docker·容器·langchain·ai agent 实战
掘金者阿豪2 小时前
别只会docker stats了:cAdvisor把CPU、内存、磁盘和网络监控搬进Web页面
后端
企业数字化笔记2 小时前
多租户系统从哪里开始设计?租户身份、数据隔离、权限与套餐的整体方案
java·spring boot·后端·junit
10年前端老司机2 小时前
一次业务迭代:聊聊知识库多版本可追溯审核流程怎么做
人工智能·后端·agent
邱杰4702 小时前
多 Agent 客服的短期记忆改造:用 Redis + Checkpointer 管理会话状态
后端
高级程序源2 小时前
springboot校园外卖平台13676-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·tomcat·maven·课程设计