在 Spring Boot 中使用 application.properties 中的 Maven 属性
Using Maven properties in application.properties in Spring Boot
我正在尝试将属性从 pom.xml 加载到 application.properties。我想创建两个配置文件:dev 和 prod 以使用不同的数据库 url。我使用 Jenkins 作为 CI,在我所有的应用程序中(Spring MVC 主要,没有启动项目)都使用 Maven 配置文件部署到 Tomcat。有没有可能使用 Maven 属性来做到这一点?
我试过这样的事情:
spring.datasource.url=${jdbc.url}
当然有。只需在 application.properties 文件上使用 Maven Filtering,Maven 就会在文件中写入您的配置文件特定值。
但是,您必须了解 Maven 配置文件在应用程序 package/build 时工作,而 Spring 启动配置文件在运行时工作。换句话说,使用 Maven 配置文件,您将获得配置文件特定的不可变构建,而当使用来自 Spring Boot 的配置文件时,您将能够在每次启动应用程序之前或 even while it's running 更改您的应用程序配置。
另请参阅:
在执行此操作之前,请考虑将属性文件从可部署包中外部化。这样您就可以在每个环境中部署相同的编译。它将为您的 Jenkins 节省一些实际上不必要的工作。最佳做法是只构建您的应用程序一次,但是,如果您不相信,可以按照以下方法进行构建。
在您的 pom.xml 中为 属性.
定义具有适当值的配置文件
<profile>
<id>dev</id>
<properties>
<jdbc.url>your_dev_URL</jdbc.url>
</properties>
</profile>
设置 Maven Resources Plugin 以过滤包含您的 application.properties 文件的目录。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>
如果您使用 Spring Boot 1.3 或更高版本,您应该意识到这样一个事实,即避免 Spring Boot 占位符和由 Maven 资源插件过滤的标记之间的冲突,框架引入了 a solution that requires using a different syntax 过滤值。
现在,${property.key}
您应该使用 @property.key@
。在这种情况下,您的 application.properties 必须包含以下示例才能按预期工作:
spring.datasource.url=@jdbc.url@
您还可以查看关于 separating Spring properties files for different Maven profiles 的 post。这样您就可以将 pom.xml.
中的值外部化
除 Daniel Olszewski 外,在我的 yml 文件中出现错误:(不要使用 @ 进行缩进)
所以我通过添加单引号修复了它。有人可能会发现它有帮助。
spring:
datasource:
url: '@jdbc.url@'
我正在尝试将属性从 pom.xml 加载到 application.properties。我想创建两个配置文件:dev 和 prod 以使用不同的数据库 url。我使用 Jenkins 作为 CI,在我所有的应用程序中(Spring MVC 主要,没有启动项目)都使用 Maven 配置文件部署到 Tomcat。有没有可能使用 Maven 属性来做到这一点?
我试过这样的事情:
spring.datasource.url=${jdbc.url}
当然有。只需在 application.properties 文件上使用 Maven Filtering,Maven 就会在文件中写入您的配置文件特定值。
但是,您必须了解 Maven 配置文件在应用程序 package/build 时工作,而 Spring 启动配置文件在运行时工作。换句话说,使用 Maven 配置文件,您将获得配置文件特定的不可变构建,而当使用来自 Spring Boot 的配置文件时,您将能够在每次启动应用程序之前或 even while it's running 更改您的应用程序配置。
另请参阅:
在执行此操作之前,请考虑将属性文件从可部署包中外部化。这样您就可以在每个环境中部署相同的编译。它将为您的 Jenkins 节省一些实际上不必要的工作。最佳做法是只构建您的应用程序一次,但是,如果您不相信,可以按照以下方法进行构建。
在您的 pom.xml 中为 属性.
定义具有适当值的配置文件<profile> <id>dev</id> <properties> <jdbc.url>your_dev_URL</jdbc.url> </properties> </profile>
设置 Maven Resources Plugin 以过滤包含您的 application.properties 文件的目录。
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> ... </build>
如果您使用 Spring Boot 1.3 或更高版本,您应该意识到这样一个事实,即避免 Spring Boot 占位符和由 Maven 资源插件过滤的标记之间的冲突,框架引入了 a solution that requires using a different syntax 过滤值。
现在,
${property.key}
您应该使用@property.key@
。在这种情况下,您的 application.properties 必须包含以下示例才能按预期工作:spring.datasource.url=@jdbc.url@
您还可以查看关于 separating Spring properties files for different Maven profiles 的 post。这样您就可以将 pom.xml.
中的值外部化除 Daniel Olszewski 外,在我的 yml 文件中出现错误:(不要使用 @ 进行缩进)
所以我通过添加单引号修复了它。有人可能会发现它有帮助。
spring:
datasource:
url: '@jdbc.url@'