Ant到Maven - 多个构建目标

时间:2010-01-25 14:38:46

标签: ant build maven target

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

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

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

3 个答案:

答案 0 :(得分:72)

您可以使用个人资料执行此操作...

如果您真的想使用两个单独的配置文件并自定义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>
  

除此之外:如果这看起来像很多配置,那么多语言Maven对Groovy POM的支持就差不多了。它会大大减少行数。

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

mvn package -Peverything
mvn package -Ponly-library

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

或者,您可以使用两个JAR插件执行来执行此操作...

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

以下是用于将两个自定义JAR添加到生命周期阶段“package”的构建元素。在包装“jar”的项目上执行此操作将导致jar目标运行三次。一旦作为默认生命周期绑定,然后两次自定义,分类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 ExampleSection 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 :(得分:22)

你的第一个想法是正确的。将2件分成2个项目。

maven哲学是每个项目都应该构建一个唯一的工件(jar,war,等等)

你可能一起破解某些东西,这样你只有一个maven项目可以构建2个atrifacts,但这将是一个黑客攻击。

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

答案 2 :(得分:5)

你有两个选择:

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

如果项目始终依赖于以统一方式打包的子集,则子集是成为module的良好候选者。

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

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