tangguo

Ant到Maven-多个构建目标

java

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

我可以将文件的子集拆分到另一个项目中,它将拥有自己的POM。然后,第一个项目可能依赖于此项目。但是,由于文件的子集非常小(少于10个),因此为此拥有一个全新的项目似乎过大了。

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


阅读 10

收藏
2020-11-20

共2个答案

小编典典

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

Maven的哲学是每个项目都应该构建一个唯一的工件(罐子,战争等)

您可能会一起砍东西,这样您只有一个maven项目会建立2个无义关系,但这将是一次砍。

您可以从maven调用ant,因此,如果您确实想执行此操作,那么建议您开始研究maven ant插件。工件ID为​​“ maven-antrun-plugin”

2020-11-20
小编典典

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

如果您确实想使用两个单独的配置文件并自定义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的末尾(带有project元素),并添加两个配置文件。实际上,第一个配置文件“一切”实际上就是在演示配置。该“所有”配置文件是不必要的,因为它只是复制了默认JAR插件jar目标执行的行为。第二个配置文件“ only-library”不包括任何以文本“ Main”开头的包中的任何类。调用这些配置文件:

mvn package -Peverything
mvn package -Ponly-library
我已通过Example通过Maven的第6章附带的示例应用程序对此进行了测试,运行这些命令中的任何一个都会在$ {basedir} / target中生成一个具有分类器的JAR文件。由于JAR插件的jar目标已绑定到默认maven生命周期中的软件包阶段,因此这两个配置文件将修改此插件的配置。

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

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

这是用于将两个自定义JAR添加到生命周期阶段“包”的构建元素。在带有“ 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程序集插件的文档。在左侧导航菜单中,您将看到示例程序集描述符的列表。

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

尽管您可以使用配置文件执行此操作,但是将项目拆分为两个(实际上是三个)将变得更加容易。从长远来看,随着应用程序的扩展,您将面临挑战。您将负责弄清楚将要包含在每个分类JAR中的类和包的手册列表。

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

2020-11-20

回答这个问题

Nothing to preview