..
   Copyright Spack Project Developers. See COPYRIGHT file for details.

   SPDX-License-Identifier: (Apache-2.0 OR MIT)

.. meta::
   :description lang=en:
      Learn about the Maven build system in Spack for building and managing Java-based projects.

.. _mavenpackage:

Maven
------

Apache Maven is a general-purpose build system that does not rely on Makefiles to build software.
It is designed for building and managing Java-based projects.

Phases
^^^^^^

The ``MavenBuilder`` and ``MavenPackage`` base classes come with the following phases:

#. ``build`` - compile code and package into a JAR file
#. ``install`` - copy to installation prefix

By default, these phases run:

.. code-block:: console

   $ mvn package
   $ install . <prefix>


Important files
^^^^^^^^^^^^^^^

Maven packages can be identified by the presence of a ``pom.xml`` file.
This file lists dependencies and other metadata about the project.
There may also be configuration files in the ``.mvn`` directory.

Build system dependencies
^^^^^^^^^^^^^^^^^^^^^^^^^

Maven requires the ``mvn`` executable to build the project.
It also requires Java at both build- and run-time.
Because of this, the base class automatically adds the following dependencies:

.. code-block:: python

   depends_on("java", type=("build", "run"))
   depends_on("maven", type="build")


In the ``pom.xml`` file, you may see sections like:

.. code-block:: xml

   <requireJavaVersion>
      <version>[1.7,)</version>
   </requireJavaVersion>
   <requireMavenVersion>
      <version>[3.5.4,)</version>
   </requireMavenVersion>


This specifies the versions of Java and Maven that are required to build the package.
See https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN402 for a description of this version range syntax.
In this case, you should add:

.. code-block:: python

   depends_on("java@7:", type="build")
   depends_on("maven@3.5.4:", type="build")


Passing arguments to the build phase
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The default build and install phases should be sufficient to install most packages.
However, you may want to pass additional flags to the build phase.
For example:

.. code-block:: python

   def build_args(self):
       return ["-Pdist,native", "-Dtar", "-Dmaven.javadoc.skip=true"]


External documentation
^^^^^^^^^^^^^^^^^^^^^^

For more information on the Maven build system, see: https://maven.apache.org/index.html
