This guide will teach you to build Java application using the maven build tool. This is a step-by-step guide for beginners where we will discuss all the important aspects of a java application build from a DevOps perspective.
As a devops engineer, learning the application build process is very important as you will be actively working on CI/CD tasks. If you have good knowledge of java applications and the build process, you can collaborate easily with developers and make everyone’s life easy in terms of setting up CI/CD for java based applications.
What is Maven?
Maven makes use of the pom.xml file to build java projects.
Project Object Model (POM) is an XML file that contains the java project details, configurations, and settings required for maven to build the project.
pom.xml file is present in the root of the java project directory. Primarily it contains the project dependencies.
For example, when a developer wants to implement a PostgreSQL database connectivity functionality, he will make use of the PostgreSQL JDBC Driver dependency from the maven repository by adding it to the pom.xml file.
So when you build the code with maven, it reads the
pom.xml file and downloads all the dependencies from the maven repository. Dependencies could be third-party libraries from the public Maven Repository or common libraries hosted within an organization’s private maven repository. You can compare it with Python pip, Nodejs npm, or Ruby gems
Commonly organizations use Sonatyope nexus as a private hosted maven repository.
By default, maven uses the public repository but if you have in-house private maven repositories, you configure custom maven repository URLs in
settings.xml maven configuration present in the maven installation directory. for example,
For maven to work you need the following installed on your system
- Java JDK
To install and configure JDK and maven, follow the maven installation guide.
Build Java Application Using Maven
For this example, we will be using the open-source java spring boot application named pet-clinic.
First, clone the application to your development machine or server.
git clone https://github.com/spring-projects/spring-petclinic.git
The code base has the following important folders and files. It is common in real-time project code as well.
- /src folder: This folder contains the source code based on the java spring framework.
- /src/tests folder: This folder contains the unit tests & integration tests of the code under the
- pom.xml file: It contains all the dependencies required for the pet-clinic applications. As it is an open-source application, all the dependencies are from the public maven repository.
To build the project, cd into the project root directory. In my case its
spring-petclinic. It should contain the
From a CI perspective, we just have to build, test, and package the project to create a deployable artifact(jar file)
So commonly in the CI process, we build and package the java projects using the following maven command. It compiles the code, tests it, package it as a jar file in the target folder, and will also install(copy) the jar package in the local
mvn clean install
After executing the above command, you will see a folder named
target in the root directory. Inside the target directory, you will see the packaged jar file as shown below. We call it a deployable artifact.
Even time you run
mvn clean install, it deletes target directory and packages from the local
.m2 repository and replaces it with the latest build files and packages.
If you want to skip the test during build, you can add the
-Dmaven.test.skip=true parameter as shown below.
mvn clean install -Dmaven.test.skip=true
Now that you have understood how to build a java project using maven, let’s look into the maven lifecycle. Few commands we don’t have to use in the CI pipelines. However, it is good to know about the maven lifecycle commands and you can use them depending on your CI pipeline requirement.
Maven Lifecycle Explained
Let’s take a look at each maven lifecycle phase in order. Each phase executes all the phases before it. For example, if you execute the third phase, one, two, and three get executed.
1. Maven Validate (mvn validate)
mvn validate validates the maven project. It downloads all the required dependencies to the local
2. Maven Compile (mvn compile)
mvn compile compiles the java project. It runs validate first and then compiles the code.
3. Maven Test (mvn test)
mvn test command runs the unit test that is part of the code. You can test classes individually, methods individually, or add patterns to run tests on all methods that match the pattern.
4. Maven Package (mvn package)
mvn package commands compile the code, test it and finally package it in the required format (jar or war)
5. Maven Verify (mvn verify)
mvn verify command runs all the phases explained before in order and runs checks on integration tests and checkstyles if they are defined in the project.
6. Maven Install (mvn install)
mvn install command installs the packaged code in the local maven repository.
7. Maven Deploy (mvn deploy)
mvn deploy command, deploys the package to the remote maven repository. When you run deploy, it first runs validate, compile, test, package, verify, install, and then finally deploys the package to the remote maven repository.
Possible Maven Build Errors
java.lang.IllegalStateException: Unable to load cache item
If maven doesn’t support the Java version, you will get the above error.
To rectify it, install the latest maven version that supports the installed Java version.
If you try to execute the maven command from the location where there is no
pom.xml file, you will get the following error.
The goal you specified requires a project to execute but there is no POM in this directory
To rectify this, execute the maven command from the folder that has the pom.xml file.
Maven Build FAQs
Does mvn package run tests?
Yes. By default, the
mvn package command runs the test. However, you can add the flag
-Dmaven.test.skip to skip the tests.
What does Maven test do?
mvn test runs all the unit tests for the java project.
As a Devops engineer, it is very important to understand the java build process if you are working on deploying java projects.
For most java projects, maven is used as a build tool for development and Continuous integration. So ensure, you have the same version of maven installed from the development to the CI environment.