我有一个目前正在转换为Maven的Ant构建。但是,Ant构建有2个构建目标-一个构建整个应用程序,一个从这些文件中的一些(仅少数)构建JAR。在Ant中,很容易有多个构建目标来处理此问题,但是我正在尝试确定在Maven中处理此问题的最佳方法。
我可以将文件的子集拆分到另一个项目中,它将拥有自己的POM。然后,第一个项目可能依赖于此项目。但是,由于文件的子集非常小(少于10个),因此为此拥有一个全新的项目似乎过大了。
还有其他方法可以解决此问题吗?
您的第一个想法是正确的。将2个部分拆分为2个项目。
Maven的哲学是每个项目都应该构建一个唯一的工件(罐子,战争等)
您可能会一起砍东西,这样您只有一个maven项目会建立2个无义关系,但这将是一次砍。
您可以从maven调用ant,因此,如果您确实想执行此操作,那么建议您开始研究maven ant插件。工件ID为“ maven-antrun-plugin”
您可以使用个人资料来执行此操作…
如果您确实想使用两个单独的配置文件并自定义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章向您展示如何将这些单模块组件组合成一个更大的多模块项目。