是的。程序集插件创建的程序集附加到您的项目,因此它也被部署。
是的。您可以使用程序集的 id 作为依赖分类器来引用它。
Javadoc 插件可以生成项目的 javadoc 文件。此外,Javadoc 插件可以打包它们!
请参阅Javadoc 插件文档。
作为弃用除单个目标之外的所有目标的一部分,默认情况下不再继承组装插件的目标及其配置/执行。
如果您需要继承配置/执行,则需要通过在父 POM 中的插件声明中添加一行来明确说明:
<plugin> <artifactId>maven-assembly-plugin</artifactId> <inherited>true</inherited> ...
<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 及更高版本中可用。
程序集 ID 用于报告和计算描述符/组件合并。他们还需要避免与项目构建过程的主要输出发生冲突。这个 id 必须到位,以便在不经意间覆盖项目的主要工件,并帮助错误报告对用户有意义。省略程序集 id 一直是一个错误,但不幸的是,以前的版本在模型中包含一个错误,允许空或缺少程序集 id。此错误已在 2.2 版中修复。
但是,在某些情况下,将程序集输出用作主要项目工件是有意义的。那么,在这些情况下正确的方法是什么?这个用例意味着需要经过深思熟虑的配置,因此您偏离正常行为的意图将很清楚。要将程序集输出配置为主要项目工件,请执行以下步骤:
处理带有和不带有分类器的混合依赖包的最佳方法是使用 ${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>
您可以使用 :
GNU tar 对 tar 文件中的 UID/GUID 的最大值有限制。考虑使用定义更明确的 POSIX tar 格式,它应该支持更大的值。在 assembly:single 目标中使用 tarLongFileMode=posix。