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

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

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

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

相关推荐
一小路一4 小时前
从0-1学习Mysql第五章: 索引与优化
数据库·后端·学习·mysql·面试
mah6664 小时前
SpringBoot项目连接Oracle视图报错整理
spring boot·后端·oracle
IT学长编程4 小时前
计算机毕业设计 基于SpringBoot的智慧社区管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·后端·毕业设计·课程设计·论文笔记·1024程序员节
奋斗的小方5 小时前
Springboot基础篇(3):Bean管理
java·spring boot·后端
扣丁梦想家6 小时前
《Spring Boot + MySQL高性能应用实战:性能优化技巧与最佳实践》
spring boot·后端·mysql
夏天的味道٥7 小时前
36. Spring Boot 2.1.3.RELEASE 中实现监控信息可视化并添加邮件报警功能
java·spring boot·后端
bobz9657 小时前
ipsec vpn over kube-ovn eip
后端
程序员清风7 小时前
程序员最大的悲哀是什么?
java·后端·面试
小杨4048 小时前
springboot框架四个基础核心三(actuator)
spring boot·后端·架构