Ant 到 Maven - 多个构建目标

Posted

技术标签:

【中文标题】Ant 到 Maven - 多个构建目标【英文标题】:Ant to Maven - multiple build targets 【发布时间】:2011-01-09 03:08:14 【问题描述】:

我有一个当前正在转换为 Maven 的 Ant 构建。但是,Ant 构建有 2 个构建目标 - 一个构建整个应用程序,一个从其中一些文件(仅少数)构建 JAR。在 Ant 中,很容易有多个构建目标来处理这个问题,但我正在尝试确定在 Maven 中处理这个问题的最佳方法。

我可以将文件子集拆分为第二个项目,它会有自己的 POM。那么第一个项目可能依赖于这个。但是,由于文件的子集非常小(少于 10 个),因此为此创建一个全新的项目似乎有点过头了。

还有其他方法可以解决这个问题吗?

【问题讨论】:

【参考方案1】:

您可以使用个人资料来做到这一点...

如果您真的想使用两个单独的配置文件并自定义 JAR 插件以包含和排除类和包名称的模式,您可以通过在您的 POM 中添加类似这样的内容来轻松做到这一点:

<profiles>
  <profile>
    <id>everything</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>everything</classifier>
            <includes>
              <include>**/*</include>
            </includes>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>only-library</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>only-library</classifier>
            <excludes>
              <exclude>**/Main*</exclude>
            </excludes>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

除此之外:如果这看起来需要大量配置,那么 polyglot Maven 对 Groovy POM 的支持已经准备就绪。它将大大减少行数。

您可以将它放在 pom.xml 的末尾(带有 project 元素),它会添加两个配置文件。第一个配置文件“一切”实际上只是为了演示配置。这个“一切”配置文件是不必要的,因为它只是复制了默认 JAR 插件 jar 目标执行的行为。第二个配置文件“only-library”不包括任何以文本“Main”开头的包中的任何类。要调用这些配置文件:

mvn package -Peverything
mvn package -Ponly-library

我针对Chapter 6 of Maven by Example 附带的示例应用程序对此进行了测试,运行这些命令中的任何一个都会在 $basedir/target 中生成一个具有分类器的 JAR 文件。由于 JAR 插件的 jar 目标绑定到默认 maven 生命周期中的 package 阶段,这两个配置文件将修改此插件的配置。

或者,您可以通过两个 JAR 插件执行来做到这一点...

如果您需要在不使用配置文件的情况下创建两个 JAR。您可以将 JAR 插件的 jar 目标多次绑定到包生命周期阶段,并为每个配置的执行使用不同的配置。如果您配置两个单独的执行,则每个执行都有一个特定于执行的配置块,因此您可以为每个执行提供唯一标识符和包含/排除模式。

这是您将用于将两个自定义 JAR 添加到生命周期阶段“包”的构建元素。对带有“jar”打包的项目执行此操作将导致 jar 目标运行 3 次。一次作为默认生命周期绑定,然后两次用于两个自定义的分类 JAR。

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
          <execution>
            <id>only-library</id>
            <goals><goal>jar</goal></goals>
            <phase>package</phase>
            <configuration>
              <classifier>only-library</classifier>
              <excludes>
                <exclude>**/Main*</exclude>
              </excludes>
            </configuration>
          </execution>
          <execution>
            <id>everything</id>
            <goals><goal>jar</goal></goals>
            <phase>package</phase>
            <configuration>
              <classifier>everything</classifier>
              <includes>
                <include>**/*</include>
              </includes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

如果您不是在谈论在每个工件中包含一组不同的类,您会想要使用 Maven 程序集。如果您想了解程序集的详细信息,可以在 Maven 的此答案末尾列出一章:完整参考。坦率地说,我不认为这一章是一个很好的介绍性参考。事实上,我有很多报告说本章几乎无法阅读(我们正在努力解决这个问题)。如果您正在寻找使用程序集,我推荐Maven Assembly Plugin's documentation。在左侧导航菜单中,您将看到示例程序集描述符列表。

免责声明:(请)不要这样做。如果您要使用两组不同的类创建两个不同的 JAR,我强烈建议您将项目拆分为两个相互依赖的模块。

虽然您可以使用配置文件执行此操作,但将项目分成两部分(实际上是三部分)会更容易。从长远来看,随着应用程序的扩展,您将面临挑战。您将负责找出要包含在您的每个分类 JAR 中的类和包的手动列表。

拥有一个引用两个独立模块的简单父项目的开销最小。如果您查看免费的 Maven by Example 一书,我们将展示如何在单模块和多模块项目之间进行转换。 Chapters 3-5 专注于单模块项目,Chapter 6 向您展示如何将这些单模块组件组合成一个更大的多模块项目。

更多信息:

您的问题涉及以下主题,这里有一些链接将为每个主题提供更多详细信息:

Maven JAR 插件:http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

多模块 Maven 项目:Chapter 6 of Maven by Example 和 Section 3.6.2 of Maven: The Complete Reference。

Maven 生命周期(如果你的包是“jar”,jar 绑定到包):Section 3.5.2 of Maven by Example "Core Concepts" 和Chapter 4 of Maven: The Complete Reference

Maven 程序集:首先是Maven Assembly Plugin site,然后是Chapter 8 of Maven: The Complete Reference,用于一些繁重(几乎过于繁重)的细节。

【讨论】:

哇,汤姆回答得很好。大+1。 感谢您的详细回答。我想远离使用包模式。如果其他开发人员进来但不一定知道需要使用的模式,这似乎是一个维护难题。【参考方案2】:

你的第一个想法是正确的。将 2 个部分拆分为 2 个项目。

maven 的理念是每个项目都应该构建一个且唯一的工件(jar、war 等)

您可能会一起破解一些东西,这样您就只有一个构建 2 个 atrifacts 的 maven 项目,但这将是一个 hack。

你可以从maven调用ant,所以如果你真的想这样做,那么我建议你开始看maven ant插件。工件 id 是“maven-antrun-plugin”

【讨论】:

【参考方案3】:

你有两个选择:

Profiles Assemblies

如果子集只是资源的集合,那么我不会将其作为单独的模块。

如果项目始终依赖于以统一方式打包的子集,那么该子集很适合成为module。

如果子集以多种不同的“风味”重新包装,那么我将为每个“风味”定义程序集并使用“分类器”限定工件名称,请参阅maven coordinates。

最后,您可以使用配置文件来确定生成哪些程序集,您的默认配置文件可能只会创建开发期间所需的初始工件“风味”。 一旦开发完成,“完整”配置文件可能会生成工件的所有“风味”变体以供最终部署。

【讨论】:

我使用程序集来打包我构建的工件以及依赖项、脚本等。使用程序集构建文件子集是否常见?或者将文件子集拆分到自己的项目中是更好的做法?

以上是关于Ant 到 Maven - 多个构建目标的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Maven 包装 Ant 构建?

将复杂项目从 Ant 迁移到 Maven - 如何处理不寻常的文件夹结构?

使用 OSGI 从 Ant 迁移到 Maven?

我们可以在 VSTS 中为 Maven 构建任务使用多个目标吗

使用maven将多个资源目录复制到独立的目标目录

maven中的多个antrun任务