在 Spring Boot 的 application.properties 中使用 Maven 属性

Posted

技术标签:

【中文标题】在 Spring Boot 的 application.properties 中使用 Maven 属性【英文标题】:Using Maven properties in application.properties in Spring Boot 【发布时间】:2016-08-10 18:04:13 【问题描述】:

我正在尝试将 pom.xml 中的属性加载到 application.properties。我想创建两个配置文件:dev 和 prod 以使用不同的数据库 url。我使用 Jenkins 作为 CI,在我的所有应用程序(主要是 Spring MVC,没有 Boot 项目)中都使用 maven 配置文件部署到 Tomcat。使用 maven 属性可以做到这一点吗? 我尝试过这样的事情: spring.datasource.url=$jdbc.url

【问题讨论】:

【参考方案1】:

除了 Daniel Olszewski,在我的 yml 文件中我得到了一个错误:(不要使用@进行缩进)

所以我通过添加单引号来修复它。有人可能会觉得它有帮助。

spring:
 datasource:
  url: '@jdbc.url@'

【讨论】:

【参考方案2】:

在您执行此操作之前,请考虑将属性文件从您的可部署包中外部化。这样,您可以在每个环境中部署相同的编译。它将为您的 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 的帖子。这样您就可以将 pom.xml 中的值外部化。

【讨论】:

这在不使用 标签的情况下是行不通的。 Maven 配置文件默认未激活。您需要自己激活它。您可以在调用构建时使用-P 标志触发配置文件。您不必强制使用activeByDefault 请注意,如果您对属性使用 yaml 格式,请确保用单引号将占位符括起来:url '@jdbc.url@' 你知道如何逆转吗?在 pom xml 中访问应用程序属性 请注意,测试资源不会被过滤。【参考方案3】:

当然有。只需在您的 application.properties 文件上使用Maven Filtering,Maven 就会在文件中写入您的配置文件特定值。

但是,您必须了解,虽然 Maven 配置文件在应用程序打包/构建时工作,但 Spring Boot 配置文件在运行时工作。换句话说,使用 Maven 配置文件,您将获得特定于配置文件的不可变构建,而使用 Spring Boot 中的配置文件时,您将能够在每次启动之前更改应用程序配置或even while it's running。

另请参阅:

Externalize the configuration of SpringApplication

【讨论】:

您可以在此处查看我的答案:***.com/questions/36635163/… 以获取有关如何外部化属性的示例

以上是关于在 Spring Boot 的 application.properties 中使用 Maven 属性的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 单元测试未检测到自动装配组件的模块

如何确保在 Apache Tomcat 中运行的 Spring Boot 应用程序中替换了环境变量占位符?

Spring Boot - CORS 过滤器适用于 GET,但不适用于其他 HTTP 动词

升级到最新版本时 Spring Boot 国际化不起作用

spring boot项目application.properties多环境配置文件jar包外部配置文件

SpringBoot报错:Failed to load ApplicationContext(javax.websocket.server.ServerContainer not available)