In the book so far, we have discussed most of the key concepts related to Maven. Here in this chapter, we focus on best practices associated with all those core concepts. The following best practices are essential ingredients in creating a successful/productive build environment. The following criteria will help you evaluate the efficiency of your Maven project if you are mostly dealing with a large-scale, multi-module project:
The rest of the chapter talks about 25 industry-accepted best practices that would help you to improve developer productivity and reduce any maintenance nightmares.
In the following example, you will notice that the dependency versions are added to each and every dependency defined in the application POM file:
<dependencies> <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <version>2.26</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.2</version> </dependency> </dependencies>
Imagine that you have a set of application POM files in a multi-module Maven project that has the same set of dependencies. If you have duplicated the artifact version with each and every dependency, then to upgrade to the latest dependency, you need to update all the POM files, which could easily lead to a mess.
Not just that, if you have different versions of the same dependency used in different modules of the same project, then it's going to be a debugging nightmare in case of an issue.
With proper dependency management, we can overcome both the previous issues. If it's a multi-module Maven project, you need to introduce the dependencyManagement
configuration element in the parent POM so that it will be inherited by all the other child modules:
<dependencyManagement> <dependencies> <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <version>2.26</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.2</version> </dependency> </dependencies> </dependencyManagement>
Once you define dependencies
under the dependencyManagement
section as shown in the previous code, you only need to refer a dependency
by its groupId
and artifactId
tags. The version
tag is picked from the appropriate the dependencyManagement
section:
<dependencies> <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> </dependencies>
With the previous code snippet, if you want to upgrade or downgrade a dependency, you only need to change the version
of the dependency under the dependencyManagement
section.
The same principle applies to plugins as well. If you have a set of plugins, which are used across multiple modules, you should define them under the pluginManagement
section of the parent module. In this way, you can downgrade or upgrade plugin versions seamlessly just by changing the pluginManagement
section of the parent POM, as shown in the following code:
<pluginManagement> <plugins> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.4.2</version> </plugin> <plugin> <artifactId>maven-site-plugin</artifactId> <version>2.0-beta-6</version> </plugin> <plugin> <artifactId>maven-source-plugin</artifactId> <version>2.0.4</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.13</version </plugin </plugins> </pluginManagement>
Once you define the plugins in the pluginManagement
section, as shown in the previous code, you only need to refer a plugin from its groupId
(optional) and the artifactId
tags. The version
tag is picked from the appropriate pluginManagement
section:
<plugins> <plugin> <artifactId>maven-resources-plugin</artifactId> <executions>……</executions> </plugin> <plugin> <artifactId>maven-site-plugin</artifactId> <executions>……</executions> </plugin> <plugin> <artifactId>maven-source-plugin</artifactId> <executions>……</executions> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <executions>……</executions> </plugin> </plugins>
Maven plugins were discussed in detail in Chapter 5, Maven Plugins.
18.191.235.8