12.2. Assembly基础

在我们进一步讨论之前,最好先花几分钟来讲一下Assembly插件的两个主要目标:assembly:assembly,和single mojo。我用不同的方式列出这两个目标,是因为这样可以很好的体现它们不同的使用方式。assembly:assembly目标被设计成直接从命令行调用,它永远不应该被绑定到生命周期阶段。反之,single mojo被设计成作为你每日构建的一部分,应该被绑定到项目生命周期的某个阶段。

有这种区别的主要理由是,assembly:assembly目标在Maven术语中是一个聚合mojo;意思是,无论有多少个模块正被构建,该mojo在一个构建中最多被运行一次。它从根项目的中提取配置——通常是顶层POM或者命令行目录的POM。而在绑定到生命周期后,一个聚合mojo就会有很多讨厌的副作用。它会强迫package生命周期阶段提前运行,从而造成在一次构建中package阶段被执行了两次。

由于assembly:assembly目标是一个聚合mojo,在多模块构建中它造成了一些问题,它应当在命令行中作为单独的mojo被调用。永远不要将assembly:assembly目标绑定到生命周期阶段中。assembly:assembly是Assembly插件最原始的目标,不是被设计成用作项目标准构建过程的一部分的。但很显然,为一个项目生成套件归档合情合理,因此开发了single mojo。该mojo假设它被绑定到了构建过程的正确部分,因此它能访问它在大型模块Maven项目生命周期中执行需要的项目文件及构件。在一个多模块环境中,它会执行很多次,因为它被绑定到了不同模块的POM上。不像assembly:assemblysingle从来不会强制在它之前执行另外一个生命周期阶段。

除了上述的两项,Assembly插件还提供了很多其它目标;然后,讨论这些mojo超出了本章范围,主要是由于它们是为一切奇怪或者过时的用例服务的,基本上不会被用到。只要可能,你都应该坚持在命令行生成套件时使用assembly:assembly,在绑定到生命周期阶段生成套件时使用single

12.2.1. 预定义的套件描述符

虽然很多人选择创建他们自己的归档解决方案——称之为套件描述符——但这不是必须的。Assembly插件为一些常用的归档类型提供了内置的描述符,你可以不写 一行配置就马上使用。以下的套件描述符是由Maven Assembly插件预定义的:

bin

假设一个项目构建了一个jar作为它的主构件,bin 描述符用来包裹该主构件和项目的LICENSE, README, 和NOTICE文件。我们可以认为这是一个完全自包含项目的最可能小的二进制分发包。

jar-with-dependencies

jar-with-dependencies描述符构建一个带有主项目jar文件和所有项目运行时依赖未解开内容的JAR归档文件。外加上适当的Main-Class Manifest条目(在下面的“插件配置”讨论),该描述符可以为你的项目生成一个自包含的,可运行的jar,即使该项目含有依赖。

project

project描述符会简单的将你文件系统或者版本控制中的项目目录结构整个的归档。当然,target目录会被忽略,目录中的版本控制元数据文件如.svnCVS目录也会被忽略。基本上,该描述符的目的是创建一个解开后就立刻能由Maven构建的归档。

src

src描述符生成一个包含你项目源码,pom.xml文件,以及项目根目录中所有LICENSEREADME,和NOTICE文件的归档。它类似于project描述符,大部分情况下能生成一个可以被Maven构建的归档。然而,由于它假设所有的源文件和资源文件都位于标准的src目录下,它就可能遗漏那些非标准的目录和文件,而这些文件往往对构建起着关键作用。