在开发场景中,通常有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.OracleDriver
type: 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的环境配置来构建项目。