首页 文章

Ant到Maven - 多个构建目标

提问于
浏览
51

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

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

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

3 回答

  • 72

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

    maven的理念是每个项目都应该构建一个唯一的工件( jar ,战争,等等)

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

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

  • 22

    You could do this with profiles...

    如果您真的想要使用两个单独的配置文件并自定义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附带的示例应用程序对此进行了测试,并且运行这些命令中的任何一个将在$ / target中生成具有分类器的JAR文件 . 由于JAR插件的jar目标绑定到默认maven生命周期中的包阶段,因此这两个配置文件将修改此插件的配置 .

    Or, you could do this with two JAR plugin executions...

    如果您需要在不使用配置文件的情况下创建两个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>
    

    如果你不是在谈论在每个工件中包含一组不同的类,那么你认为这个特定的章节是一个很好的介绍性参考;事实上,我've had numerous reports that this chapter is nearly unreadable (and we'正在努力解决这个问题 . 如果您想使用组件,我建议使用Maven Assembly Plugin's documentation . 在左侧导航菜单中,您将看到一个示例程序集描述符列表 .

    Disclaimer: (Please) don't do this. If you are creating two difference JARs with two different set of classes I strongly recommend that you split the project up into two interdependent modules.

    虽然您可以使用配置文件执行此操作,但您可以更轻松地将项目拆分为两个(实际上是三个) . 从长远来看,随着应用程序的扩展,您将面临挑战 . 您将负责确定每个分类JAR中包含的类和包的手册列表 .

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

    For more information:

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

    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,用于一些沉重(几乎太重)的细节 .

  • 5

    你有两个选择:

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

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

    如果子集在多个不同的"flavours"中重新打包,那么我将为每个"flavour"定义程序集,并使用"classifier"参见maven coordinates来限定工件名称 .

    最后,您可以使用配置文件来确定生成哪些程序集,您的默认配置文件可能只会创建开发期间所需的初始工件"flavour" .
    一旦开发完成,"full"配置文件可以生成工件的所有"flavour"变体以进行最终部署 .

相关问题