需求:
使用 Maven根据不同的构建环境(如开发、测试、生产)来定义不同的配置,实现灵活的构建管理。
需要Demo项目的可以参考:我的demo项目
一、项目分层
一般的初创项目不会有特别多的配置文件,所以使用 spring.profiles.active就可以满足需求,但伴随项目规模扩大,引入的依赖/中间件越多,配置文件越多,仅仅靠单一的文件无法满足,可以参考下面的结构:
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── github
│ │ └── resources
│ │ ├── resources-env
│ │ │ ├── dev
│ │ │ └── prod
│ │ └── static
1. 使用 Maven 配置不同环境
在 Maven 中,
<profiles>
是一个非常强大的功能,它允许你根据不同的构建环境(如开发、测试、生产)来定义不同的配置。在 pom.xml 文件中使用<profiles>
,可以对插件、依赖、属性等进行差异化配置,进而实现灵活的构建管理。
1.1 配置不同的环境
pom.xml配置如下:
<profiles>
<!-- 本地开发 -->
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault> <!-- 默认使用 dev -->
</activation>
</profile>
<!-- 测试 -->
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<!-- 预发 -->
<profile>
<id>pre</id>
<properties>
<env>pre</env>
</properties>
</profile>
<!-- 生产 -->
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
1.2 配置构建信息
pom.xml文件如下:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources/resources-env/${env}</directory>
<filtering>true</filtering> <!-- 启用资源过滤 -->
</resource>
</resources>
<plugins>
<!-- spring 配置文件可以使用占位符读取pom.xml中的变量 例如 @env@ -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
</plugins>
</build>
1.3 Spring 配置文件激活不同环境的配置文件
application.properties 文件配置如下:
spring.profiles.active=@env@
1.4 构建项目
命令参考:
mvn clean package -Pprod
二、可能遇到的问题
2.1 IDEA直接启动项目,读取不到环境配置文件
项目环境变量设置有问题。
解决方法:
IDEA 操作 File -> Project Structure -> Modules 设置 Resources 就可以了
2.2 启动项目,报错:IOException: DerInputStream.getLength()
错误原因是因为
<filtering>true</filtering>
会进行文件过滤,非纯文本文件(例如.p12二进制文件)需要进一步配置。
参考:解决方案
2.3 Maven 打包缺少环境配置文件
Spring 项目配置文件位置:
- 默认
src/main/resources
目录下的文件config
子目录下的配置文件打包时需要进一步处理。
参考:解决方案
三、进一步优化
3.1 缩小应用jar包的体积
伴随项目依赖越来越大,应用jar包的体积会越来越大,可以进一步优化。
参考:优化依赖打包