详细分析 @@ 和 ${} 的来源及启动配置
        
            
            
              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 文件。 bashjava -jar target/your-app.jar
- 
覆盖配置(可选) :通过命令行参数或环境变量覆盖默认值。 - 
覆盖 Nacos 地址 : bashjava -jar target/your-app.jar --NACOS_HOST=192.168.1.50 --NACOS_PORT=8849或使用环境变量: bashexport NACOS_HOST=192.168.1.50 export NACOS_PORT=8849 java -jar target/your-app.jar
- 
强制激活 Spring Profile (仅在配置允许覆盖时有效): bashjava -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)。 | 
注意事项
- 命名空间冲突 :根据 Nacos 的规范,默认命名空间(public)无需配置 namespace字段。在dev环境中,namespace为空,表示使用默认命名空间。
- 环境隔离 :test和prod环境的namespace设置为x(示例值),实际使用时应替换为真实的命名空间 ID。
- 配置优先级:命令行参数 > 环境变量 > 配置文件默认值。优先使用运行时动态配置,避免频繁重新打包。
通过以上配置和命令,可以实现多环境(开发、测试、生产)的灵活切换和动态参数覆盖。