Welcome to Buildozer

Buildozer is a tool that performs transitive build on Maven modules. In contrast to Maven's multi-module build, buildozer builds only changed modules, and modules depending on them; but no builds outside the dependency graph of desired modules.

User indicates which module(s) he needs to get, and buildozer itself determines and invokes neccessary builds:

  • by examining dependency graph
  • skips builds that are up-to-date and need no rebuild
  • skips modules depending on failed builds
  • performs all builds unaffected by failures (the "fail-at-end" semantics)

How does transitive build work ?

Transitive build is strictly based on dependencies - a module can be built after all its dependencies are built.

This simple rule significantly affects the number of builds actually executed.

For completeness, we should define that module is built if its latest change (= in its directory subtree) is older than the time of latest installation to the local repository.

More reading:

  • Module registry - mapping logical module coordinates to filesystem location

How does multi-module build work ?

Multi-module build, performed by Maven on POM's that have some content within <modules> tag, is very simple. Maven recurses into submodules and performs the requested goals/phases on each module that it finds along the way.

Multi-modules implement relation that is very similar - if not equal - to containment.

If you work on the project, you typically need to build all the modules at once, even those neither changed not affected by changes. For small projects it might be unimportant; but if your codebase grows to hundreds of module, the time lost by uselessly building all modules is huge and the response becomes annoyingly slow.

Maven uses its reactor to de-reference logical module identification to the physical filesystem location; simply said, it puts the whole tree into the reactor, and then builds all of it.

Note that Maven 2.2 and higher introduces few options that allow to limit the number of builds actually invoked: --projects, --also-make, and --also-make-dependents. These allow to build multi-module projects more efficiently; it is still too hard to use by end-user, but simple continuous integration system can enjoy it.