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

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

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.activenacos.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> 配置替换(如 testprod 环境替换为 xdev 环境为空)。

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 环境替换为 xdev 环境为空(使用默认命名空间)。
${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. 环境隔离testprod 环境的 namespace 设置为 x(示例值),实际使用时应替换为真实的命名空间 ID。
  3. 配置优先级:命令行参数 > 环境变量 > 配置文件默认值。优先使用运行时动态配置,避免频繁重新打包。

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

相关推荐
阳光是sunny4 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦4 小时前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny4 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
皮皮林5515 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
努力的小雨5 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康6 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
腾渊信息科技公司7 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
IT_陈寒8 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学8 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
码事漫谈8 小时前
1999年的电商前夜和2026年的AI前夜 历史押韵但从不重复
后端