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

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

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. 配置优先级:命令行参数 > 环境变量 > 配置文件默认值。优先使用运行时动态配置,避免频繁重新打包。

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

相关推荐
熊小猿1 小时前
在 Spring Boot 项目中使用分页插件的两种常见方式
java·spring boot·后端
paopaokaka_luck1 小时前
基于SpringBoot+Vue的助农扶贫平台(AI问答、WebSocket实时聊天、快递物流API、协同过滤算法、Echarts图形化分析、分享链接到微博)
java·vue.js·spring boot·后端·websocket·spring
小蒜学长3 小时前
springboot酒店客房管理系统设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
橙子家3 小时前
Serilog 日志库简单实践(一):文件系统 Sinks(.net8)
后端
Yeats_Liao4 小时前
Go Web 编程快速入门 13 - 部署与运维:Docker容器化、Kubernetes编排与CI/CD
运维·前端·后端·golang
Yeats_Liao4 小时前
Go Web 编程快速入门 14 - 性能优化与最佳实践:Go应用性能分析、内存管理、并发编程最佳实践
前端·后端·性能优化·golang
七夜zippoe5 小时前
仓颉语言核心特性深度解析——现代编程范式的集大成者
开发语言·后端·鸿蒙·鸿蒙系统·仓颉
软件架构师-叶秋5 小时前
spring boot入门篇之开发环境搭建
java·spring boot·后端
QX_hao6 小时前
【Go】--接口(interface)
开发语言·后端·golang
superman超哥6 小时前
仓颉语言中正则表达式引擎的深度剖析与实践
开发语言·后端·仓颉