在Spring Boot中,可以在构建时根据不同环境切换包含在WAR中的application.properties文件
正如之前在”使用Spring Boot创建WAR并部署到另一个Tomcat”的文章中提到的,在开发过程中我们使用Spring Boot的内嵌Tomcat进行开发,但在测试环境和生产环境中,我们可能需要将WAR文件部署到提前准备好的另一个Tomcat上来运行。那么这时候的application.properties文件应该怎么处理呢?
举个例子,假设有dev1、dev2和dev3这三个环境。我们可以在构建时将dev1环境的配置(如数据库连接和模式等)放在一个名为application.properties的文件中,将dev2环境的配置放在另一个application.properties文件中,dev3环境的配置则放在另一个application.properties文件中。然后将这些配置文件都包含在WAR文件中,这样是不是很方便呢?
在Spring Boot的配置文件功能中无法实现
一般而言,Spring Boot的application.properties文件的配置通常会像以下这样。
我会试试在这种情况下用以下两种方法。
试着使用Spring Boot的profile功能进行启动
在Spring Boot中,通过以下方式可以动态切换配置文件中的profile。官方文档中详细介绍了这个功能。
java -jar -Dspring.profiles.active=dev1 spring-boot-application-properties-1.0.0.jar
请注意,这仅仅是关于使用Spring Boot内置的Tomcat启动Tomcat的讨论。这里假定您将使用java命令来运行可执行jar文件。在这种情况下,您只需要事先准备好以下命令,针对每个环境即可。
如果在名为dev1的环境中运行,
java -jar -Dspring.profiles.active=dev1 spring-boot-application-properties-1.0.0.jar
如果在名为dev2的环境中运行的话
java -jar -Dspring.profiles.active=dev2 spring-boot-application-properties-1.0.0.jar
在调试环境dev3中运行
java -jar -Dspring.profiles.active=dev3 spring-boot-application-properties-1.0.0.jar
正如标题所示,“将WAR文件中的application.properties根据不同环境切换”是另一个话题,因此无法实现上述要求。
试着使用 application.properties 文件中的 spring.profiles.active=XXX 选项。
spring.profiles.active=dev1
如果是这样的话,切换应该是可行的。
然而,在“在构建时根据环境切换包含在WAR中的application.properties”的这一点上,由于无法动态切换active,所以每次想要部署的环境发生变化时,都需要修改application.properties中的spring.profiles.active=部分并提交重新构建(如果想要部署到dev2环境,则需要修改为spring.profiles.active=dev2并提交,对于dev3也是一样的情况)。
你打算怎么做?
在这种情况下,可以使用Maven的配置文件功能来解决问题。
按照以下的结构创建目录:“src/环境标识符/resources”,并将每个环境的配置存储在相应的application.properties文件中。
# dev1 environment setting
# dev2 environment setting
# dev3 environment setting
接下来,您需要在pom.xml文件中添加如下配置来设置profile。
<profiles>
<profile>
<id>dev1</id> // ←環境識別子
<build>
<resources>
<resource>
<directory>src/dev1/resources</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
<profile>
<id>dev2</id> // ←環境識別子
<build>
<resources>
<resource>
<directory>src/dev2/resources</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
<profile>
<id>dev3</id> // ←環境識別子
<build>
<resources>
<resource>
<directory>src/dev3/resources</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
</profiles>
希望您能参考Maven3中针对不同环境管理资源差异的方法,以了解关于Maven的配置文件。
最后,通过在-P选项中指定环境标识符(在pom.xml文件的id属性中指定的值,例如dev1、dev2或dev3),进行构建(创建WAR文件)。
mvn package -Pdev1 spring-boot:repackage
当查看生成的WAR文件时,我们可以确认只有一个application.properties文件存在。另外,在查看其内容时,我们还可以看到WAR文件中包含了通过-P选项指定的环境标识符(此处为dev1)下的resources目录下的application.properties文件。
如果想要部署到dev2,只需按照以下方式操作即可。
mvn package -Pdev2 spring-boot:repackage
通过这样做,现在src/dev2/resources/application.properties将包含在WAR中。
总结
虽然开始的时候是关于Spring Boot的话题,但似乎变成了关于Maven的话题,不过如果使用Maven的profile功能是可以实现的。