在开发场景中,通常有dev、sit和prod三个环境,分别对应开发、内部测试和生产。
在不同的环境中,因为数据、资源等隔离需要,往往需要不同的配置,这样在部署项目的时候就有着多套配置集灵活选择的需求(避免手动修改的繁琐操作)。
Maven中的profiles配置集就是很好的一个解决方案,需要那个配置就指定激活那个配置。
profile配置集
<profiles><!--基本配置--><profile><id>base</id> <properties></properties><activation><!--默认激活此配置集--><activeByDefault>true</activeByDefault></activation><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><systemPropertyVariables><API_GW_xxx_SECRET_TOKEN>${apigw.com.secret.token}</API_GW_xxx_SECRET_TOKEN><API_GW_yyy_SECRET_TOKEN>${apigw.cstk.secret.token}</API_GW_yyy_SECRET_TOKEN><API_GW_zzz_SECRET_TOKEN>${apigw.dmgfe.secret.token}</API_GW_zzz_SECRET_TOKEN><MY_DB_USERNAME>${dmg.db.username}</MY_DB_USERNAME><MY_DB_PASSWORD>${dmg.db.password}</MY_DB_PASSWORD><MY_DB_URL>${dmg.db.jdbc.url}</MY_DB_URL><MY_DB_INITIAL_POOL_SIZE>${dmg.db.init.pool.size}</DMG_DB_INITIAL_POOL_SIZE><MY_DB_MIN_POOL_SIZE>${dmg.db.min.pool.size}</MY_DB_MIN_POOL_SIZE><MY_DB_MAX_POOL_SIZE>${dmg.db.max.pool.size}</MY_DB_MAX_POOL_SIZE><KAFKA_HOST>${kafka.host}</KAFKA_HOST><KAFKA_ORDER_STATUS_CHANGE_TOPIC>${kafka.topic.delivery-status-change}</KAFKA_ORDER_STATUS_CHANGE_TOPIC><KAFKA_INTERNAL_TOPIC>${kafka.topic.delivery-status-change-internal}</KAFKA_INTERNAL_TOPIC><LIS_FTP_USERNAME>${lis.ftp.username}</LIS_FTP_USERNAME><LIS_FTP_PASSWORD>${lis.ftp.password}</LIS_FTP_PASSWORD><LIS_FTP_HOST>${lis.ftp.host}</LIS_FTP_HOST><LIS_FTP_HOME_DIR>${lis.ftp.home.dir}</LIS_FTP_HOME_DIR></systemPropertyVariables></configuration></plugin></plugins></build></profile><!-- dev 环境 --><profile><id>dev</id><properties><java.options></java.options><replica.count>1</replica.count><route.name>echoo.dev.com</route.name><spring.profiles.active>dev</spring.profiles.active><namespace>test-dev</namespace></properties><build><plugins><plugin><groupId>org.eclipse.jkube</groupId><artifactId>openshift-maven-plugin</artifactId><configuration><access><namespace>ruby-delivery-sit</namespace><masterUrl>https://master.ocp.echoo.com:8443</masterUrl><apiVersion>v1</apiVersion></access><resources><replicas>1</replicas></resources></configuration></plugin></plugins></build></profile><!-- sit 环境 --><profile><id>sit</id></profile><!-- prod环境 --><profile><id>prod</id></profile></profiles>
几个常用属性:
<activation><!--默认激活此配置集--><activeByDefault>true</activeByDefault></activation>
<activation>
是激活属性,里面配置一些 profile 的激活相关的配置。
<activeByDefault>true</activeByDefault>
是默认激活配置。true 表示这个 profile 默认是激活的,除非在命令行或其他地方明确指定了不激活它,相反 false 就表示默认不激活,除非指定激活。通常用来配置一些基本项。
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><systemPropertyVariables><API_GW_xxx_SECRET_TOKEN>${apigw.com.secret.token}</API_GW_xxx_SECRET_TOKEN><API_GW_yyy_SECRET_TOKEN>${apigw.cstk.secret.token}</API_GW_yyy_SECRET_TOKEN><API_GW_zzz_SECRET_TOKEN>${apigw.dmgfe.secret.token}</API_GW_zzz_SECRET_TOKEN><MY_DB_USERNAME>${dmg.db.username}</MY_DB_USERNAME><MY_DB_PASSWORD>${dmg.db.password}</MY_DB_PASSWORD><MY_DB_URL>${dmg.db.jdbc.url}</MY_DB_URL><MY_DB_INITIAL_POOL_SIZE>${dmg.db.init.pool.size}</DMG_DB_INITIAL_POOL_SIZE><MY_DB_MIN_POOL_SIZE>${dmg.db.min.pool.size}</MY_DB_MIN_POOL_SIZE><MY_DB_MAX_POOL_SIZE>${dmg.db.max.pool.size}</MY_DB_MAX_POOL_SIZE><KAFKA_HOST>${kafka.host}</KAFKA_HOST><KAFKA_ORDER_STATUS_CHANGE_TOPIC>${kafka.topic.delivery-status-change}</KAFKA_ORDER_STATUS_CHANGE_TOPIC><KAFKA_INTERNAL_TOPIC>${kafka.topic.delivery-status-change-internal}</KAFKA_INTERNAL_TOPIC><LIS_FTP_USERNAME>${lis.ftp.username}</LIS_FTP_USERNAME><LIS_FTP_PASSWORD>${lis.ftp.password}</LIS_FTP_PASSWORD><LIS_FTP_HOST>${lis.ftp.host}</LIS_FTP_HOST><LIS_FTP_HOME_DIR>${lis.ftp.home.dir}</LIS_FTP_HOME_DIR></systemPropertyVariables></configuration></plugin></plugins></build>
<build>
是项目构建属性,里面配置与项目构建相关的配置。
<plugins>
是插件属性,里面配置插件。比如这里配置了一个spring-boot-maven-plugin
,用来打包springboot项目。
<configuration>
是插件的配置属性,与对应的插件绑定。
<systemPropertyVariables>
是系统属性,这里自定义了很多系统属性,这些属性通常包含外部依赖的配置信息,如数据库连接、API 密钥、外部服务URL等。
这些属性在运行时可以通过 Java 的 System.getProperty()
方法访问,也可以在项目配置文件中以引用的方式${property-name}
直接获取,比如:
spring:datasource:username: ${MY_DB_USERNAME}password: ${MY_DB_PASSWORD}url: ${MY_DB_URL}driver-class-name: oracle.jdbc.driver.OracleDrivertype: oracle.ucp.jdbc.PoolDataSource
<!-- dev 环境 --><profile><id>dev</id><properties><java.options></java.options><replica.count>1</replica.count><route.name>echoo.dev.com</route.name><spring.profiles.active>dev</spring.profiles.active><namespace>test-dev</namespace></properties><build><plugins><plugin><groupId>org.eclipse.jkube</groupId><artifactId>openshift-maven-plugin</artifactId><configuration><access><namespace>ruby-delivery-sit</namespace><masterUrl>https://master.ocp.echoo.com:8443</masterUrl><apiVersion>v1</apiVersion></access><resources><replicas>1</replicas></resources></configuration></plugin></plugins></build></profile>
<java.options></java.options>
: Java选项属性,为了在将来的配置中设置JVM的启动选项。
<replica.count>1</replica.count>
: 指定应用的副本数量为1。
<route.name>echoo.dev.com</route.name>
: 定义路由名称(应用的访问URL)。
<spring.profiles.active>sit</spring.profiles.active>
: 这告诉 Spring 框架要激活名为 sit 的Spring profile。
<namespace>ruby-delivery-sit</namespace>
: 指定 OpenShift 中的命名空间(namespace),应用将在此命名空间中部署。
这里配置了一个 OpenShift 的 Maven 插件,用于
<configuration>
: OpenShift 插件的配置部分。
<access>
: OpenShift集群的访问配置。
<namespace>
: 与上面提到的<properties>
中的<namespace>
相同,再次定义了OpenShift的命名空间。
<masterUrl>
: OpenShift 集群的主URL,后续就通过这个URL把项目推上容器。
<apiVersion>
: OpenShift API 的版本。
<resources>
: OpenShift 资源配置。
<replicas>
: 定义了应用的副本数量,与<properties>
中的<replica.count>
相对应。
配置参数来源
<MY_DB_USERNAME>${my.db.username}</MY_DB_USERNAME>
这里的${my.db.username}
的真实值可以有多种来源:
- Maven 属性文件:
Maven 的settings.xml
文件中可以定义属性。
pom.xml
文件的<properties>
标签内,也可以定义属性。这些属性可以在整个pom.xml
文件中通过${property-name}
的形式引用。 - Maven 命令行参数:
使用-D
参数可以在 Maven 命令行中自定义属性。例如:
mvn clean install -Dmy.db.username=your-value
。 - 外部属性文件:
可以使用maven-resources-plugin
或其他插件来从外部文件(如.properties
文件)加载属性。这通常用于从版本控制系统中管理的文件中读取敏感信息,如数据库凭据。 - 等等…
mvn打包指定profile
mvn -DskipTests -P dev clean package
-P dev
表示指定激活id为dev的配置集。
这样maven就会用dev的环境配置来构建项目。