在项目开发中可能会产生这样的需求,开发环境依赖于 A 包,测试环境依赖 B 包,生产环境依赖于 C 包。按照我们传统的思维会每个环境注释掉相应的包,然后再打包,一次两次操作还好,操作多了之后这样会很麻烦。
Maven 不同环境引用依赖
Maven 配置
<profiles>
<!-- 测试环境 -->
<profile>
<id>dev</id>
<!-- 默认激活 dev 环境 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<dependencies>
<!-- pay_provider -->
<dependency>
<groupId>com.allens.test</groupId>
<artifactId>allens-redis</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<dependencies>
<!-- pay_provider -->
<dependency>
<groupId>com.allens.test</groupId>
<artifactId>allens-redis</artifactId>
<version>2.0-SNAPSHOT</version>
</dependency>
</dependencies>
</profile>
</profiles>
切换不同环境
我们可以在idea的Maven窗口中选中需要的profile环境,然后在lifecircle 中 clean install即可。
当然我们也可以使用maven 命令进行打包指定不同环境
## 开发环境打包
mvn clean package -P dev
## 测试环境打包
mvn clean package -P test
## 生产环境打包
mvn clean package -P pr
最佳实践
① Springboot 热部署插件,在开发环境需要,在测试环境、预发环境、生产环境都是不需要的。
② OceanBase 不同版本适配的不同的操作系统,我们可以借助profile配置不同环境下配置不同的包来做到不同环境切换依赖。
Maven不同环境打包不同配置
和传统的部署方式不同,我们将配置文件放入到不同的目录,使用build>resource来在编译的时候,通过读取不同环境的profiles.active
属性来获取不同环境目录下的配置打包到classpath目录中。
- 传统的配置方式
传统配置方式会将配置文件放到resources底下,然后给配置文件命名 application-${env}.yml
来区分不同环境。在JVM参数中指定-Dspring.active.profiles=${env}或者在idea中:
或者在 bootstrap.yml 或者application.yml中指定默认的配置:
spring:
profiles:
active: ${env}
所有环境的配置都会打包到jar包中。
- maven通过编译打包确定环境配置
只有需要的环境配置才会打包到jar包中
maven 配置
<profiles>
<!-- 测试环境 -->
<profile>
<id>dev</id>
<!-- 默认激活 dev 环境 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profiles.active>dev</profiles.active>
<pay.dubbo.version>1.0.0-SNAPSHOT</pay.dubbo.version>
</properties>
<dependencies>
<!-- pay_provider -->
<dependency>
<groupId>com.allens.test</groupId>
<artifactId>common-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<dependencies>
<!-- pay_provider -->
<dependency>
<groupId>com.allens.test</groupId>
<artifactId>common-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</profile>
</profiles>
<build>
<!-- 指定maven编译资源文件位置 -->
<resources>
<!-- 编译 src/main/resources 中的资源文件 -->
<resource>
<directory>src/main/resources</directory>
</resource>
<!-- 根据不同的 mvn 命令参数编译 filters 目录中指定的配置文件 -->
<resource>
<directory>src/main/config/${profiles.active}</directory>
<targetPath>./</targetPath>
</resource>
</resources>
</build>