组装插件中似乎有大量可用的 mojo。我应该使用哪个目标来构建我的程序集?

你应该使用单一的魔力。除单曲外的所有 mojo均已弃用。

[最佳]


如果程序集插件在打包阶段运行,我的程序集会在部署阶段部署吗?

是的。程序集插件创建的程序集附加到您的项目,因此它也被部署。

[最佳]


我可以使用由程序集插件创建的工件作为依赖项吗?

是的。您可以使用程序集的 id 作为依赖分类器来引用它。

[最佳]


如何使用 Assembly Plugin 打包项目的 javadoc 文件?

Javadoc 插件可以生成项目的 javadoc 文件。此外,Javadoc 插件可以打包它们!

请参阅Javadoc 插件文档

[最佳]

在之前的版本中(2.2 最终版之前),我遵循了共享程序集描述符文档中的示例,该示例建议使用<descriptors/>配置部分来引用共享程序集描述符。从 2.2 版开始, 这不再有效。为什么不?

<descriptors/>的使用总是不正确的,与此配置参数的设计背道而驰。不幸的是,在 2.2-beta-2 版本中引入了一些代码,允许此参数引用类路径上的描述符,而不是像设计意图那样被迫使用<descriptorRefs/> 。在 2.2 版中,此错误已修复。

重要的是要注意正确的形式<descriptorRefs/<一直有效,并且继续有效。文档现已修复以反映正确的配置。

[最佳]

作为正常构建过程的一部分,我应该使用什么目标来创建程序集?

使用单一目标。

注意:所有其他 mojo 已被弃用,因为它们可能在各种情况下导致奇怪和不可预测的行为,或者因为它们是冗余的,因为dir汇编格式和maven-dependency-plugin的可用性。

由于assemblyattachdirectorydirectory-inline目标都是聚合器,因此每次执行 Maven 时它们最多执行一次。有关与聚合器 mojos 相关的问题的更多信息,请参阅Atypical+Plugin+Use+Cases (wiki)。

[最佳]


程序集插件说它找不到我的程序集描述符包含的模块二进制文件。是什么赋予了?

如果您的程序集包含模块二进制文件,则这些二进制文件将不可用于程序集插件,除非在特殊情况下。当组装插件绑定到多模块构建的父 POM中标准构建生命周期的一个阶段时,通常会看到这种情况。这是 Maven 对多模块项目布局的构建过程进行排序和执行方式的结果。

在多模块层次结构中,当子模块在其 <parent/> 部分中声明父 POM 时,Maven 将此解释为意味着父项目的构建必须在子构建开始之前完成。这可确保在子项目需要访问其 POM 信息时,父项目处于其最终形式。如果组装插件作为该父项目的构建过程的一部分包含在内,它将与其他所有内容一起作为父构建的一部分执行 -在子构建可以开始之前。如果该父构建中使用的程序集描述符引用模块二进制文件,则它实际上期望子构建在处理程序集之前完成. 这会导致递归依赖情况,其中子构建依赖于父构建才能启动,而父构建依赖于子模块工件的存在才能成功完成。由于缺少这些工件,Assembly Plugin 将抱怨缺少工件,并且构建将失败。

在许多情况下,您可以通过添加一个新的子模块来避免此问题,该子模块的唯一目的是生成您的程序集。在这个新项目的 POM 中,为您之前引用的任何模块二进制文件添加依赖项定义。这将确保最后构建新的子程序集。然后,将您的程序集描述符移动到这个新的子模块中。此时,您可以选择将所有 moduleSet/binaries 引用更改为 dependencySet 引用,或者您可以保留 moduleSets 并将每个 moduleSet 的 useAllReactorProjects 标志设置为true

显然,您可能在此描述符中拥有的任何文件集或文件引用都可能需要调整,或者将它们引用的文件与描述符本身一起移动到新的子模块中。

在绝对必须使用模块二进制文件引用的情况下,您应该创建上面提到的程序集子 POM,然后将 <useAllReactorProjects>true<useAllReactorProjects>插入到每个moduleSet部分。然后,使用单一目标将程序集绑定到您的程序集子 POM(通常到阶段)中。当您从顶级 POM 执行构建时,Maven 应该在新的子项目中生成您的程序集。

注意: useAllReactorProjects 标志仅在 2.2 及更高版本中可用。

[最佳]


在以前的版本中(在 2.2 最终版之前),省略程序集 id 并未配置分类器会导致程序集被用作项目的主要工件。在 2.2 版本中,此配置会导致验证错误。我的项目依赖于之前的行为!为什么这发生了变化,我怎样才能在我的项目中进行这项工作?

程序集 ID 用于报告和计算描述符/组件合并。他们还需要避免与项目构建过程的主要输出发生冲突。这个 id 必须到位,以便在不经意间覆盖项目的主要工件,并帮助错误报告对用户有意义。省略程序集 id 一直是一个错误,但不幸的是,以前的版本在模型中包含一个错误,允许空或缺少程序集 id。此错误已在 2.2 版中修复。

但是,在某些情况下,将程序集输出用作主要项目工件是有意义的。那么,在这些情况下正确的方法是什么?这个用例意味着需要经过深思熟虑的配置,因此您偏离正常行为的意图将很清楚。要将程序集输出配置为主要项目工件,请执行以下步骤:

  1. 确保您的程序集只使用一种格式。不止一种格式可能意味着用于项目主要工件的组装工件是不确定的。
  2. 将配置:<appendAssemblyId>false</appendAssemblyId>添加到您的程序集插件执行中。这将防止组装工件简单地附加到项目中。

[最佳]

我有一个dependencySet,其中包括一些带有分类器的工件,以及其他没有分类器的工件。如何设置文件映射以正确处理这两种情况?

处理带有和不带有分类器的混合依赖包的最佳方法是使用 ${dashClassifier?}表达式,该表达式是在程序集插件的 2.2-beta-2 版本中添加的,特别是为此目的。此表达式将确定每个工件是否具有分类器,如果有,它将替换工件的分类器 - 前面带有破折号 - 代替表达式。

例如,假设您想要包含两个工件,commons-logging-1.0.4.jar 和 yourserver-1.0-client.jar(其中“client”是第二个工件的分类器)。为此,只需将以下内容添加到您的依赖项集中:

<outputFileNameMapping>${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
       

[最佳]