使用场景:

项目开发过程中,我们有多种开发环境,使用pom文件统一管理配置,然后使用@xx@读取配置,报错。

org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token found character '@' that cannot start any token. (Do not use @ for indentation)  in 'reader', line 5, column 13:         active: @spring.profiles.active@

 

解决方案:

在pom.xml中增加如下配置:

 <build>
        <resources>
            <resource>
                <directory>src/main/resources/</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
 </build>

配置详解:

这段配置是 Maven 项目中的资源配置部分,位于 pom.xml 文件中的 <build> 部分。它定义了 Maven 如何处理项目资源文件。下面是对配置的详细解释:

<resources> 元素

<resources> 元素定义了一组资源,这些资源将被包含在项目的构建过程中。在 Maven 构建生命周期中,这些资源会被复制到输出的 JAR 或 WAR 文件中。

<resource> 元素

<resource> 元素指定了一个具体的资源集合。可以有多个 <resource> 元素,每个元素定义了不同的资源集合。

directory 属性

<directory> 元素指定了资源文件所在的目录。在这个例子中,src/main/resources/ 是 Maven 约定的标准目录,用于存放项目资源文件,如配置文件、属性文件等。

filtering 属性

<filtering> 属性是一个布尔值,用于指定是否对资源文件进行过滤。过滤是指 Maven 替换资源文件中的占位符(通常是 ${...} 形式的变量)为实际的值。这个值通常来自于 pom.xml 文件中的属性或者环境变量。

  • true:开启过滤功能,Maven 会替换资源文件中的占位符。
  • false:关闭过滤功能,资源文件中的占位符不会被替换。

作用

在你提供的配置中,<filtering>true</filtering> 表示 Maven 将对 src/main/resources/ 目录下的资源文件进行过滤处理。这意味着,如果这些资源文件中包含了像 ${project.version}、${env.MY_VARIABLE} 这样的占位符,Maven 会在构建过程中将它们替换为 pom.xml 中定义的相应属性值或者环境变量值。

例如,如果你有一个 application.properties 文件,里面包含了这样的行:

app.version=${project.version}

在构建过程中,Maven 会查找 pom.xml 文件中定义的 project.version 属性,并将其值替换到 app.version 中。

这种机制非常有用,特别是在需要根据不同环境(开发、测试、生产)使用不同配置的情况下,你可以通过定义不同的 Maven 属性来实现配置的自动化替换,而不需要手动修改资源文件。

更多推荐