Core Java

How to Set JVM Arguments for Maven Builds

Effectively managing JVM arguments is essential for optimizing performance and configuring the build environment in modern Java development. Apache Maven offers several methods to pass JVM arguments, ensuring that our application runs smoothly across different environments.

One effective way to manage these settings is through Maven’s global configuration options, which allow us to apply JVM arguments consistently across all builds. Additionally, we can leverage project-specific configurations to tailor the JVM settings according to our project’s needs. This article will guide you through various methods to pass JVM arguments in Maven, including setting them globally and using the .mvn/jvm.config file.

1. Passing JVM Arguments Globally

To set JVM arguments globally for all Maven builds, we can configure the MAVEN_OPTS environment variable. The MAVEN_OPTS environment variable allows us to specify JVM arguments that will be applied to all Maven builds. This is a convenient method for setting global options without modifying project files.

export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=256m"

This sets the maximum heap size to 1024 MB and the maximum permanent generation size to 256 MB for all Maven builds.

2. Setting Default JVM Options via jvm.config

Another approach to specifying JVM arguments for Maven builds is to use the .mvn/jvm.config file. This file allows us to define JVM arguments that will be applied to all Maven builds for a specific project. This method is useful when we want to ensure consistent JVM settings across different environments and team members working on the same project.

To use this method, we need to create a .mvn directory in the root of our Maven project if it doesn’t already exist. Inside this directory, create a file named jvm.config and add your JVM arguments to it.

Here is an example of a Maven project directory structure including the .mvn/jvm.config file:

project directory structure for Java Maven with the jvm.config file to pass JVM arguments

Now, we can manually edit the jvm.config file and add the following content:

-Xmx1024m
-XX:MaxPermSize=256m

The .mvn/jvm.config file is read by Maven during the build process, and the JVM arguments specified in this file are applied to the Maven execution. This ensures that every time you or someone else runs Maven for this project, the specified JVM settings are used, providing consistency across different development environments.

The .mvn/jvm.config file can be enriched with various JVM arguments and system properties to customize our build environment further. Below, we will add some additional configurations including system properties for SLF4J logging and a flag to show the JVM version.

-Xmx1024m
-XX:MaxPermSize=256m
-Dorg.slf4j.simpleLogger.showDateTime=true
-Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss
-Dorg.slf4j.simpleLogger.showThreadName=true
--show-version
  • -Xmx1024m: Sets the maximum heap size to 1024 MB.
  • -XX:MaxPermSize=256m: Sets the maximum permanent generation size to 256 MB (note: this is specific to older JVMs and may not be needed in newer versions which use metaspace instead of permgen).
  • -Dorg.slf4j.simpleLogger.showDateTime=true: Enables the display of the date and time in SLF4J SimpleLogger output.
  • -Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss: Sets the format of the date and time in SLF4J SimpleLogger output to hours, minutes, and seconds.
  • -Dorg.slf4j.simpleLogger.showThreadName=true: Enables the display of the thread name in SLF4J SimpleLogger output.
  • --show-version: Displays the JVM version information at the start of the Maven build process.

When you run the mvn verify command with the enhanced configuration settings in the .mvn/jvm.config file, you will notice several key pieces of information in the output:

Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
java 11.0.11 2021-04-20 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode)
10:29:54 [main] [INFO] Scanning for projects...

10:30:06 [main] [INFO] ------------------------------------------------------------------------
10:30:06 [main] [INFO] BUILD SUCCESS
10:30:06 [main] [INFO] ------------------------------------------------------------------------
10:30:06 [main] [INFO] Total time:  12.090 s
10:30:06 [main] [INFO] Finished at: 2024-07-27T10:30:06+01:00
10:30:06 [main] [INFO] ---------------------------------------------------------

The output shows detailed JVM version information, improved logging with timestamps and thread names, and optimized memory settings.

3. Conclusion

In conclusion, effectively managing and configuring JVM arguments is a crucial aspect of optimizing performance and ensuring a stable build environment in Java Maven projects. By understanding how to pass JVM arguments globally and through the .mvn/jvm.config file, we can achieve consistent and efficient builds across different environments. These techniques not only enhance the performance of our applications but also simplify the management of project-specific configurations.

4. Download the Source Code

This article focused on how to pass JVM arguments in Java Maven builds.

Download
You can download the full source code of this example here: java maven pass jvm arguments

Omozegie Aziegbe

Omos holds a Master degree in Information Engineering with Network Management from the Robert Gordon University, Aberdeen. Omos is currently a freelance web/application developer who is currently focused on developing Java enterprise applications with the Jakarta EE framework.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button