The JBoss parent POM provides default configuration for Maven builds.
-
Recommended/Default versions for the most commonly used Maven plugins
-
Manifest configuration for the jar and assembly plugins
-
Profiles for generating source jars, and enforcing a minimum versions of Java and Maven
-
Distribution Management and other configuration for deploying to the JBoss.org Maven repositories
Start out by adding the parent configuration to your pom.
<parent>
<groupId>org.jboss</groupId>
<artifactId>jboss-parent</artifactId>
<version>40</version>
<!-- The empty relativePath makes Maven look it up in the repository. Missing tag default is ../pom.xml. -->
<relativePath/>
</parent>
The pom includes properties which allow various build configuration to
be customized. For example, to override the default version of the
maven-compiler-plugin
, just set a property.
<properties>
<version.compiler.plugin>3.1</version.compiler.plugin>
</properties>
Or override the default Java compiler source and target level used in
the build. Note the default level is 11. Also note that the preferred way to set the source/target version for compilation is to use one of the build-release-XXX
control files instead, which will set the javac
--release
flag to the corresponding version.
<properties>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
</properties>
The minimum version of Java or Maven required to run a build can also be set via properties.
<properties>
<maven.min.version>3.9.0</maven.min.version>
<jdk.min.version>17</jdk.min.version>
</properties>
If jdk.min.version
is not set, it defaults to the version defined by the maven.compiler.source
property.
For the full list of properties, refer to the POM itself.
The parent POM includes a Maven profile called jboss-release
. This
profile contains settings for generating a full project source archive,
javadoc jar files, and release deployment metadata. If using the Maven
release plugin, this profile will automatically be activate during the
release:perform step.
If the Maven release plugin is not used during the release process, the profile can be manually activated from the command line during a release build.
mvn -Pjboss-release deploy
This POM includes a Maven profile called "gpg-sign" which provides default configuration to generate GPG signatures for the build artifacts.
mvn -Pgpg-sign deploy
In order for the gpg plugin to properly create a signature for each
artifact, the properties gpg.keyname
and gpg.passphrase
must be
available to the current build. These properties can either be set in a
build profile, or on the command line.
<profile>
<id>gpg-config</id>
<properties>
<gpg.keyname>me@home.com</gpg.keyname>
<!-- Don't keep passphrase in plain text! -->
<gpg.passphrase>secret</gpg.passphrase>
</properties>
</profile>
Starting with version 30, the JBoss Parent POM provides a framework for multi-release JAR build and test.
The multi-release JAR support works in two parts: compilation and testing.
Compilation works by providing extra executions of the compiler plugin in order to build the additional JAR layers. The
base layer is built by the standard default-compile
execution. After that, Maven profiles are activated based on the
presence of extra layer source directories (e.g. src/main/java12
, src/main/java16
etc.). These profiles contain
additional executions of the compiler plugin which compile the sources in the layer directory, while putting the output
of the previous step on the class path.
Each present layer is in turn compiled with the results of all the previous layers on the classpath in the correct order.
The additional layer class files are output under the target/classes
directory in the appropriate location for
multi-release JAR layers.
In order to select the correct class files for the given Java version, the <release>
property is used.
This prevents accidental usage of APIs which are only present in later versions than the one
being compiled.
Testing using maven-surefire-plugin
is supported by running the project unit tests on
every supported Java version. In order to do so, it is expected that the following system
property or properties are set as needed:
-
java11.home
: this property must be set to the location of a Java 11 JDK installation -
java17.home
: this property must be set to the location of a Java 17 JDK installation -
java21.home
: this property must be set to the location of a Java 21 JDK installation
In order to simplify development, it is recommended to project maintainers to set these
properties in your personal Maven settings.xml
file.
Extra unit tests are run for a given platform whenever a newer version than that platform was used to build the project and the appropriate control file is found (see Build control files reference).
To configure a multi-release JAR, you need the following pieces of information:
-
The minimum (oldest) version of Java that will be supported by the project
-
The maximum (newest) version of Java for which your project has sources
Choose your base layer version. This can be Java 11 or anything later. Configure the version by configuring the
release
property in the default-compile
execution of maven-compiler-plugin
:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<release>17</release>
</configuration>
</execution>
</executions>
</plugin>
If the build-release-11
, build-release-17
, or build-release-21
file is present in the root of your project, then this step is automatically done for you. Only one such file should be present.
Configure the jdk.min.version
property as described above to match either:
-
The maximum (newest) Java version for which sources exist in your project, or
-
Some Java version higher than that
This is the version of Java that will build all of your layers, so it necessarily must be able to compile every version of Java sources from oldest to newest.
The sources for your base layer continue to reside in src/main/java
and src/test/java
.
Additional layers are in directories whose names correspond to the version of Java that
is targeted by that directory. For example, sources which are specific to Java 13 and later
would be in src/main/java13
, whereas sources which are specific to Java 16 and later would
be in src/main/java16
.
If you have a class that needs an alternative implementation for a given Java version, you only need to provide the replacement source file in the directory corresponding to the oldest version that supports the alternative source. It is not necessary to copy identical classes into more than one layer; doing so will increase the size of the resultant artifact needlessly.
There are restrictions on these directories. You may only provide sources that correspond to sources that exist in the base layer - that is, it is a violation of the MR JAR specification to provide sources that introduce new APIs only in later Java versions. The JDK does enforce this at run time. In addition, providing additional public members in later versions is generally not recommended.
Using this functionality with GitHub Actions is relatively simple. It entails adding the additional JDK version(s) by way of a setup action, and then passing the location of each additional JDK to the build.
As an example, for a project that is built on Java 17 but must also be tested against JDK 11 your build.yml
might look something like this:
jobs:
build:
runs-on: ubuntu-latest
name: Build using Maven
steps:
- uses: actions/checkout@v2
name: Checkout
- uses: actions/setup-java@v3
name: Set up JDKs
with:
distribution: temurin
java-version: |
11
17
- name: Build
run: mvn -B verify --file pom.xml "-Djava11.home=${{env.JAVA_HOME_11_X64}}"
See also the README for actions/setup-java
.
Note that this configuration causes the default JAVA_HOME
environment to be set to JDK 17.
These build control files are tested only for their presence. They do not need to have any content (i.e. they can be zero-sized).
File name | Purpose | Reference |
---|---|---|
|
Use the |
|
|
Use the |
|
|
Use the |
|
|
Run tests for Java 11 when |
|
|
Run tests for Java 17 when |
|
|
Run tests for Java 21 when |
The github wiki provides some additional examples. For questions/suggestions about the jboss-parent-pom, head to the JBoss Community Build space on the jboss.org site. Issues related to the jboss-parent-pom can be submitted to the JBoss build jira project