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

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

[最佳]


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

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

[最佳]


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

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

请参阅Javadoc 插件文档

[最佳]


从 2.2 版开始,父 POM 中定义的配置/执行不再被继承,为什么?

作为弃用除单个目标之外的所有目标的一部分,默认情况下不再继承组装插件的目标及其配置/执行。

如果您需要继承配置/执行,则需要通过在父 POM 中的插件声明中添加一行来明确说明:

          <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <inherited>true</inherited>
            ...
       

[最佳]


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

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

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

[最佳]


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

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

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

[最佳]


outputFileNameMapping 参数中可以使用哪些属性。

您可以使用 :

  • 构建中可用的所有系统或 maven 属性,语法为 ${myProperty}
  • 所有带有${env.XXX}的环境变量,其中XXX是环境变量。
  • 特殊的${dashClassifier?}属性(见上文)。
  • 所有工件属性(来自 Artifact 类),例如:
    • ${artifact.groupId}:工件组 ID。
    • ${artifact.artifactId}:工件 artifactId。
    • ${artifact.version}:工件分类器。
    • ${artifact.baseVersion}:工件的基本版本(对于 SNAPSHOT,它将始终是 -SNAPSHOT 而不是它的时间戳,即使您没有自己构建它也是如此)。
    • ${artifact.classifier}:工件分类器。
    • ${artifact.scope}:工件范围。
    • ${artifact.groupIdPath} : 工件的 groupId 作为路径
    • ${artifact.file.name}:附加到此工件的文件的名称
    • ...
    将${module.XXXXX}用于项目模块工​​件时, 您可以使用它。

[最佳]


Tar 抱怨 groupid 值太大

GNU tar 对 tar 文件中的 UID/GUID 的最大值有限制。考虑使用定义更明确的 POSIX tar 格式,它应该支持更大的值。在 assembly:single 目标中使用 tarLongFileMode=posix。

[最佳]