详细分析 @@
和 ${}
的来源及启动配置
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。 - 配置优先级:命令行参数 > 环境变量 > 配置文件默认值。优先使用运行时动态配置,避免频繁重新打包。
通过以上配置和命令,可以实现多环境(开发、测试、生产)的灵活切换和动态参数覆盖。