39

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

4

3 回答 3

98

在执行此操作之前,请考虑将属性文件从可部署包中外部化。这样,您可以在每个环境中部署相同的编译。它将为您的 Jenkins 节省一些实际上不必要的工作。最佳实践是只构建您的应用程序一次,但是,如果您不相信,这里是如何做到的。

  1. 在您的pom.xml中,使用适当的属性值定义配置文件。

    <profile>
        <id>dev</id>
       <properties>
           <jdbc.url>your_dev_URL</jdbc.url>
       </properties>
    </profile>
    
  2. 设置Maven 资源插件以过滤包含application.properties文件的目录。

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        ...
    </build>
    
  3. 如果您使用 Spring Boot 1.3 或更高版本,您应该知道,为了避免 Spring Boot 占位符和 Maven 资源插件过滤的令牌之间的冲突,该框架引入了一个解决方案,该解决方案需要对过滤值使用不同的语法

    现在,${property.key}您应该使用@property.key@. 在这种情况下,您的application.properties必须包含以下示例才能按预期工作:

    spring.datasource.url=@jdbc.url@
    

您还可以查看有关为不同的 Maven 配置文件分离 Spring 属性文件的帖子。这样您就可以将 pom.xml 中的值外部化。

于 2016-04-19T06:54:17.257 回答
8

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

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

spring:
 datasource:
  url: '@jdbc.url@'
于 2019-12-18T13:31:12.353 回答
2

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

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

也可以看看:

于 2016-04-18T20:25:29.670 回答