ant到Maven – 多个构build目标

我有一个目前正在转换为Maven的Ant构build。 但是,Ant构build有两个构build目标 – 一个构build整个应用程序,另一个从一些文件(仅less数)构buildJAR。 在Ant中,很容易有多个构build目标来处理这个问题,但我试图确定在Maven中处理这个问题的最佳方法。

我可以将文件的子集分成第二个项目,它将拥有自己的POM。 那么第一个项目就可以依靠这个。 但是,由于文件的子集非常小(less于10个),似乎有一个全新的项目可能是矫枉过正的。

还有其他的方法来处理这个?

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

maven的哲学是,每个项目应该build立一个,唯一的神器(jar子,战争,不pipe)

你也许可以把一些东西拼凑在一起,这样你只有一个maven项目build立2个离心机,但这将是一个黑客攻击。

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

你可以用个人资料做这个…

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

除此之外:如果这看起来像很多configuration,那么多边形Maven对Groovy POM的支持就已经准备就绪。 这将大大减less线数。

你可以把它放在你的pom.xml(包含项目元素)的末尾,并且添加两个configuration文件。 第一个configuration文件“一切”真的只是在那里来演示configuration。 这个“全部”configuration文件是不需要的,因为它只是复制默认JAR插件jar目标执行的行为。 第二个configuration文件“only-library”不包括以文本“Main”开头的任何包中的任何类。 要调用这些configuration文件:

 mvn package -Peverything mvn package -Ponly-library 

我对示例应用程序进行了testing,该示例应用程序随Maven示例的第6章一起提供,运行这些命令中的任何一个都将在$ {basedir} / target中生成一个具有分类器的JAR文件。 由于JAR插件的jar目标在默认maven生命周期中绑定到包阶段,因此这两个configuration文件将修改此插件的configuration。

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

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

以下是您将用于将自定义JAR添加到生命周期阶段“包”的构build元素。 在包装“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 Assemblies。 如果你想知道程序集的细节,在Maven的这个答案的末尾列出了一章:完整的参考。 坦率地说,我不认为这个章节是一个很好的介绍性参考。 事实上,我有很多报道说这一章几乎是不可读的(我们正在努力解决这个问题)。 如果你正在寻找使用程序集,我会推荐Maven Assembly Plugin的文档 。 在左侧导航菜单中,您将看到一个样品组装描述符列表。

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

虽然您可以使用configuration文件来完成此任务,但是将项目分成两个(实际上是三个)会更容易。 从长远来看,随着应用规模的扩大,将会面临一些挑战。 您将负责确定要包含在每个已分类的JAR中的类和包的手册列表。

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

了解更多信息:

您的问题涉及以下主题,以下是一些链接,将提供更多的细节:

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

多模块Maven项目: Maven示例的第6章和Maven的 3.6.2节:完整的参考 。

Maven生命周期(如果你的packagin是“jar”,jar就会被封装): Maven的例3.5.2节“核心概念”和Maven的第4章:完整的参考

Maven Assemblies:首先是Maven Assembly Plugin站点 ,然后是Maven的第8章:完整的参考了一些很重(几乎太重)的细节。

你有两个select:

  • 简介
  • 大会

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

如果项目总是依赖于以统一方式打包的子集,那么子集是成为模块的一个很好的候选者。

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

最后,您可以使用configuration文件来确定生成哪个程序集,您的默认configuration文件可能只会创build开发过程中所需的初始工件“flavor”。
一旦完成开发,“完整”configuration文件可以产生用于最终部署的工件的所有“风味”变体。