Maven 5的两个重要变化


一位 Apache Maven 提交者最近写了一篇关于他们的 Maven 5 计划的文章。最重要的变化:
需要区分两种 POM 类型:

  • 构建 POM ,存储在项目源代码控制中,在构建时使用 v5 模式,需要能够使用与新模式关联的新功能的新 Maven 版本,
  • 消费者 POM ,它以良好的旧 v4 模式发布到 Maven Central,因此每个过去或未来的构建工具都可以像往常一样继续使用预构建的工件来获取它们的依赖项。

这是一个重要的二分法,让我很长时间都没有意识到:
  • POM 的使用者需要一些数据,例如,在其依赖项列表中拥有项目的用户
  • 二进制构建器需要其他数据

在 Reddit 上,用户 pmarschall 提到他们已经在Maven Flatten 插件的帮助下分离了 Maven 当前版本中的关注点。
用法非常简单。只需在该部分中添加以下代码plugins段:
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>flatten-maven-plugin</artifactId>
    <version>1.2.5</version>
    <configuration>
    </configuration>
    <executions>
        <execution>
            <id>flatten</id>
            <phase>process-resources</phase>
            <goals>
                <goal>flatten</goal>
            </goals>
        </execution>
        <execution>
            <id>flatten.clean</id>
            <phase>clean</phase>
            <goals>
                <goal>clean</goal>
            </goals>
        </execution>
    </executions>
</plugin>

现在,如果你执行Maven process-resources阶段,该插件会创建一个缩短版的POM,名为.flattened-pom.xml。与初始POM相比,扁平化的POM除了坐标外,只有三个部分:许可、依赖和资源。此外,Maven还解决了所有变量。如果你运行安装阶段,然后检查本地Maven仓库,你会发现POM与扁平化的POM相匹配,而不是主POM。如果你想生成扁平化的POM但不替换主POM,请使用-DupdatePomFile=false。
默认情况下,该插件只保留许可证、依赖关系和存储库部分。你可以通过POM配置哪些部分需要保留,哪些不需要。例如,该插件会删除名字,但如果需要,你可以很容易地保留它。只需添加相关的配置。

<configuration>
    <pomElements>
        <name>keep</name>
    </pomElements>
</configuration>

上述方法给了你最大的灵活性。然而,插件的开发者已经考虑到哪些配置捆绑是有意义的,并提供了开箱即用的配置。
 
总结
Maven Flatten插件将构建和消费者POM分开。你不需要等到Maven 5的发布。这是一个免费的东西,所以如果你是一个库的提供者,你也许应该考虑使用它。