= Building

We use Apache Maven to build the code, distribution, etc. and to manage dependencies.

The minimum required Maven version is 3.0.0.

Note that there are some https://cwiki.apache.org/confluence/display/MAVEN/Maven+3.x+Compatibility+Notes[compatibility issues with Maven 3.X] still unsolved.
This is specially true for the https://maven.apache.org/plugins-archives/maven-site-plugin-3.3/maven-3.html['site' plugin].

== Full Release

To build the full release with the documentation & JavaDocs:
[,console]
----
$ mvn -Prelease package
----
To install it to your local maven repo:
[,console]
----
$ mvn -Prelease install
----
For any build you can skip the tests using `-DskipTests` which will make the build *much* faster, e.g.
[,console]
----
$ mvn -Prelease package -DskipTests
----

== Full Release without docs

It is possible to build a distribution without the manuals and Javadocs.
simply run
[,console]
----
$ mvn package
----

== Only docs

From the `artemis-website` module run:
[,console]
----
$ mvn -Prelease package
----
This will build the user manual (both HTML & PDF), migration guide, hacking guide, & JavaDocs.
Output will be placed in the `target/classes/user-manual`, `target/classes/migration-guide`, `target/classes/hacking-guide`, and `target/apidocs` directories respectively.

Generating the user manual's PDF adds almost a minute to the build so this can be skipped using `-DskipWebsitePdfGeneration`.

== Offline

Maven dependency:go-offline can be used to download various things the build needs. This necessitates some properties the build doesnt normally need set, so to make this work a helper profile called `go-offline` exists to have the os-maven-plugin set these properties based on the current environment. To run these together, do:
[,console]
----
$ mvn dependency:go-offline -Pgo-offline
$ mvn -o ...
----

Alternatively you can simply specify the needed properties directly, based on your environment preference. For example, on a Linux x86-64 environment you could run:
[,console]
----
$ mvn dependency:go-offline -Dos.detected.name=linux -Dos.detected.arch=x86_64 -Dos.detected.classifier=linux-x86_64
$ mvn -o ...
----

== Building the ASYNC IO library

The `ASYNCIO` `journal-type` which interacts with the Linux kernel libaio library.
The ASYNCIO journal type should be used where possible as it is far superior in terms of performance.

The ASYNCIO native library is not included in the broker _source_ distribution.
It needs to be built prior to running `mvn install` to ensure that the ASYNCIO journal type is available in the resulting build.
Don't worry if you don't want to use ASYNCIO or your system does not support libaio.
The broker will check at runtime to see if the required libraries and system dependencies are available and, if not, it will default to using NIO.

To build the ASYNCIO native libraries, please follow link:https://github.com/apache/artemis-native[these instructions].

== Open Web Application Security Project (OWASP) Report

If you wish to generate a report for dependency CVEs you may build with the `-Powasp` profile, e.g.:

[,console]
----
$ mvn -Powasp verify -DskipTests
----
The output for every module will be aggregated in `./target/dependency-check-report.html`.

== Snapshot Builds

Snapshot builds are available at https://repository.apache.org/content/repositories/snapshots/org/apache/artemis/apache-artemis/.

These are built by https://ci-builds.apache.org/job/Artemis/job/Artemis-SNAPSHOT-Deploy/[this Apache CI job].
