summaryrefslogtreecommitdiff
path: root/lib/spack/docs/build_systems/mavenpackage.rst
blob: 5b0a7cf6d7f13030894f859214e474cfa65320dd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
.. Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
   Spack Project Developers. See the top-level COPYRIGHT file for details.

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

.. _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 and Java-based project.

^^^^^^
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