Assembly Basics

Before we go any further, it’s best to take a minute and talk about the two main goals in the Assembly plugin: assembly:assembly and the single mojo. We list these two goals in different ways to reflect the difference in how they’re used. The assembly:assembly goal is designed to be invoked directly from the command line and should never be bound to a build lifecycle phase. In contrast, the single mojo is designed to be a part of your everyday build and should be bound to a phase in your project’s build lifecycle.

The main reason for this difference is that the assembly:assembly goal is what Maven terms an aggregator mojo—that is, a mojo that is designed to run at most once in a build, regardless of how many projects are being built. It draws its configuration from the root project, usually the top-level POM or the command line. When bound to a lifecycle, an aggregator mojo can have some nasty side effects. It can force the execution of the package lifecycle phase to execute ahead of time, and it can result in builds that end up executing the package phase twice.

Because the assembly:assembly goal is an aggregator mojo, it raises some issues in multimodule Maven builds, and it should be called only as a standalone mojo from the command line. Never bind an assembly:assembly execution to a lifecycle phase. assembly:assembly was the original goal in the Assembly plugin and was never designed to be part of the standard build process for a project. As it became ...

Get Maven: The Definitive Guide now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.