Maven过滤后如何验证XML?

How to validate XML after Maven filtering?

假设我有一个简单的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<root property="${my.custom.maven.property}"/>

因为my.custom.maven.property是通过Maven插件获取的,我无法修改它的值,它是非转义的UTF-8字符串,所以它可能(确实)包含特殊字符,如"。这会在打包或编译阶段(主要是在已部署的服务器...)后导致错误。我想通过 XML 验证来防止这种情况。

这里的重点是我正在使用 xml-maven-plugin:validate。这无济于事,因为我无法指定此验证应在过滤后进行(好吧,这里的过滤意味着注入那些 Maven 属性 值)。插件配置看起来很简单:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>xml-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>validate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <validationSets>
            <validationSet>
                <dir>xml_root</dir>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </validationSet>
        </validationSets>
    </configuration>
</plugin>

Maven 属性注入由资源插件处理,该插件具有绑定 by default to the process-resources phases, while the XML Maven Plugin validate goal has a default 绑定到 test 阶段,可能在构建期间为时已晚。

您可以在 Maven 生命周期的早期移动 XML 验证,并在将其绑定到 process-resources 阶段以及以下的属性注入之后立即应用它:

<executions>
   <execution>
       <phase>process-resources</phase>
       <goals>
           <goal>validate</goal>
       </goals>
   </execution>
</executions>

注意附加的 phase 元素。
因此,Maven 会注入然后验证 XML 并且您的构建将失败(如果需要)更早。

有关阶段及其顺序的完整列表,请查看 Maven 官方文档 here

注意:如果您要使用它,某些 Eclipse (m2e) 版本可能不喜欢不同的阶段绑定,您可以忽略此错误,只要命令行构建工作正常(始终信任命令行构建) .