DEV Community

Cover image for Maven Made Simple: Building Java Projects with Ease
Ayush Shrivastava
Ayush Shrivastava

Posted on • Updated on

Maven Made Simple: Building Java Projects with Ease

An easy-to-follow guide for automating builds with Maven

Maven is an essential tool for Java developers, simplifying project builds, dependency management, and version control. Whether you're new to Java or an experienced developer, understanding Maven can significantly enhance your workflow. In this article, we’ll explore how Maven works, its core features, and why it’s the go-to solution for managing complex Java projects. From automating repetitive tasks to ensuring your project stays organized, Maven makes development smoother and more efficient. By the end, you'll have a clear grasp of how to integrate Maven into your projects for faster, more reliable builds.

Maven isn’t just about managing dependencies; it’s also about streamlining the entire development process. It follows a simple yet powerful structure, using a "pom.xml" file to define the project’s dependencies, build configurations, and plugins. This approach ensures that your project stays consistent across different environments, making it easy to collaborate with teams. Moreover, Maven’s lifecycle phases automate tasks like compilation, testing, and packaging, so you can focus more on writing code. By mastering Maven, you’ll not only improve your build efficiency but also enhance the overall quality and scalability of your Java applications. Let’s dive deeper into Maven’s benefits!

Build tools

Build tools are essential for automating the process of building an application. Instead of manually compiling code, downloading dependencies, running tests, and packaging the application, build tools handle these tasks automatically. They streamline development and ensure consistency.

Here’s what build tools typically do:

  • Compile the source code into executable form.
  • Download necessary dependencies like Spring Boot, Hibernate, JUnit, etc.
  • Run unit tests to ensure the code works as expected.
  • Package the application into JAR (for standalone apps) or WAR (for web apps) files.

Popular build tools for Java include

  • Ant
  • Maven
  • Gradle

"As a Java developer, I utilize Maven for efficient project management, automating builds, and handling dependencies, ensuring streamlined development and delivery processes."

Maven

Maven is a free, open source build tools, that automate the build process of the application development. it is given by Apache Organization. It is a software which is developed using java programming language. with the help of maven we can create the project folder structure, when we develop the project so many libraries and framework we needed for the project to add that manually it is hard and time taking work for the java developer. that libraries and framework is called project dependencies, dependencies are such as (ex: Spring-Boot, Hibernate, Kafaka, email etc). Instead of we are downloading dependencies, we can tell to maven s/w to download dependencies. also maven Compile the source code, execute the test cases for testing the API functionality, and package the application as jar(Java Archieve) / war(Web Archieve).

To get started with Maven, the installation process involves downloading the binary package from the official Maven website, setting up environment variables for MAVEN_HOME, and verifying the installation through the terminal or command prompt by running mvn -version.

Maven Installation on Windows

Step 1: Download Maven To get started

download Maven from the official website: Go to the Maven Download Page. Download the binary zip archive for the latest version of Maven.

Step 2: Extract Maven

Once downloaded: Extract the downloaded ZIP file to a folder. For instance, you can use C:\Program Files\Apache\maven or another location of your choice.

Step 3: Verify Installation

To check if Maven is installed correctly, open a command prompt and run the following command:

mvn -version
Enter fullscreen mode Exit fullscreen mode

Maven Terminology

Archetype

An Archetype is a template that helps you quickly create a Maven project with a predefined structure. It defines the directory layout and initial configuration files to simplify project setup.

groupId

The groupId identifies the organization or project to which a Maven artifact belongs. It follows a reverse domain name convention (e.g., com.example.project) and ensures that dependencies are uniquely identifiable across the system.

artifactId

The artifactId is the name of the project or library. It's used along with the groupId and version to uniquely identify a specific project artifact, such as a JAR, WAR, or other packages.

packaging

The packaging type defines the build output type for your Maven project. Common options include jar, war, or pom. It determines how Maven will package the code, usually as a JAR or WAR file.

version

The version specifies the release or iteration of a Maven project. It's crucial for managing different versions of a library or artifact, allowing you to reference a specific version when adding dependencies to other projects.

SNAPSHOT : Under development
RELEASE : Development completed

Creating a Stand-Alone Application Using Maven With CMD

Maven is an excellent tool for building and managing Java projects, especially when it comes to creating stand-alone applications. Let’s walk through the steps of setting up a basic stand-alone Java application using Maven.

mvn archetype:generate -DgroupId=com.example.app -DartifactId=standalone-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Enter fullscreen mode Exit fullscreen mode
  • groupId: Uniquely identifies the project’s group.
  • artifactId: The name of your application.
  • archetypeArtifactId: Specifies the archetype for a simple Java project.

Once project created then verify project folder structure

standalone-app
│
├── src
│   ├── main
│   │   └── java               # Application source code (.java files)
│   │
│   ├── test
│   │   └── java               # Application Unit Test code (.java files)
│
└── pom.xml                    # Project Object Model (Maven configuration file)

Enter fullscreen mode Exit fullscreen mode

src/main/java is containing the application source code.
src/test/java is containing the application test source code.
pom.xml file containing the maven configurations.

POM.XML

The pom.xml file, which stands for Project Object Model, is a crucial component of any Maven project. It is automatically generated when you create a Maven project and serves as the input file for Maven software. The pom.xml file defines the project’s metadata, including its name, version, and dependencies on various frameworks such as Spring, Hibernate, Kafka, and more. Instead of manually downloading these dependencies, you can specify them in the pom.xml file, and Maven will automatically fetch them for you. This makes managing project dependencies efficient and organized, allowing developers to focus on writing code without worrying about handling each library individually. Essentially, the pom.xml acts as a roadmap for Maven, guiding it on how to build and manage your Java project.

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example.app</groupId>
    <artifactId>standalone-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>  <!-- Java version -->
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- JUnit for unit testing -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Maven Compiler Plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>

            <!-- Maven Shade Plugin for creating an executable JAR -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.example.app.App</mainClass>  <!-- Main class -->
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Enter fullscreen mode Exit fullscreen mode

Maven Goals

Maven goals represent specific tasks that can be executed during the build lifecycle of a Maven project. Each goal corresponds to a distinct action, such as compiling code, running tests, packaging artifacts, or deploying to a repository.

By invoking these goals, developers can automate and streamline their build processes, ensuring that projects are built consistently and efficiently. Each goal can be run individually or as part of a larger lifecycle phase, providing flexibility in project management.

clean: Deletes the target directory, which contains compiled code and packaged artifacts, ensuring a fresh build.

compile: Compiles the source code of the project, producing class files from Java source files in the src/main/java directory.

test: Runs the unit tests defined in the src/test/java directory using a testing framework like JUnit.

package: Packages the compiled code into a distributable format, such as a JAR or WAR file, based on the project configuration in pom.xml.

install: Installs the packaged JAR/WAR file into the local Maven repository, making it available for other projects on the same machine.

deploy: Copies the packaged JAR/WAR file to a remote repository, making it available for other developers and projects.

site: Generates a site for the project, including documentation, reports, and project information, typically found in the target/site directory.

validate: Validates the project’s configuration and verifies that all required information is available before the build begins.

verify: Runs any checks to ensure the package is valid and meets quality standards, executing any verification tasks defined in the project.

archetype: Creates a new Maven project based on a specified archetype, setting up a project structure and initial files.

These goals can be executed from the command line, allowing developers to manage the build lifecycle effectively. You can run a specific goal using the following command format:

mvn [Goal]
Enter fullscreen mode Exit fullscreen mode

Maven Repository

Maven repositories store project artifacts like libraries an dependencies. There are three main types of Maven repositories

Local Repository
Stores artifacts on your machine for quick access. it is a oyr system specific.

Remote Repository
Hosts artifacts on a server, accessible over the network. it is a organization specific.

Central Repository
Default public repository for widely used open-source libraries. it is accessed by everyone.

When you create a project and build it using Maven, it first checks your local repository (typically located at ~/.m2/repository) for any dependencies the project needs. If it finds the required dependencies in the local repository, Maven uses them directly, without downloading them again.

If the dependencies aren't available locally, Maven fetches them from a remote repository, such as Maven Central or another configured repository. Once downloaded, the dependencies are stored in the local repository for future use, so they don't need to be re-downloaded. This process helps optimize resource use and speeds up the build by preventing unnecessary downloads.

Maven build lifecycle

Maven is based around the central concept of a build lifecycle. What this means is that the process for building and distributing a particular artifact (project) is clearly defined.

For the person building a project, this means that it is only necessary to learn a small set of commands to build any Maven project, and the POM will ensure they get the results they desired.

There are three built-in build lifecycles: default, clean and site. The default lifecycle handles your project deployment, the clean lifecycle handles project cleaning, while the site lifecycle handles the creation of your project's web site.

Each of these build lifecycles is defined by a different list of build phases, wherein a build phase represents a stage in the lifecycle.

  • validate - validate the project is correct and all necessary information is available
  • compile - compile the source code of the project
  • test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
  • package - take the compiled code and package it in its distributable format, such as a JAR.
  • verify - run any checks on results of integration tests to ensure quality criteria are met
  • install - install the package into the local repository, for use as a dependency in other projects locally
  • deploy - done in the build environment, copies the final package to the remote repository for sharing with other developers and projects.

Build Lifecycle Basics

Conclusion

Maven has revolutionized how Java projects are built and managed, offering developers an efficient and automated approach to handling essential project tasks. Its core strength lies in dependency management, where Maven checks for required libraries in the local repository and fetches them from remote repositories like Maven Central if they're not available. This saves time and eliminates the need for manual dependency tracking, ensuring that projects always have the correct versions of required libraries.

The declarative nature of Maven, governed by the pom.xml file, standardizes the build process, making it easier to maintain consistency across different development environments. Whether it’s compiling code, running tests, or packaging the project for deployment, Maven's build lifecycle manages these steps seamlessly.

Additionally, Maven’s plugin system enhances its flexibility, enabling developers to integrate a wide array of tools and functionalities. Plugins for running tests, generating documentation, deploying artifacts, and more extend Maven’s utility far beyond a basic build tool.

By automating repetitive tasks and streamlining complex project setups, Maven allows developers to focus on writing code, improving productivity, and reducing potential errors. Its widespread adoption within the Java ecosystem makes it an indispensable tool for building modern, scalable, and maintainable Java applications.

Top comments (2)

Collapse
 
khmarbaise profile image
Karl Heinz Marbaise

The usage of MAVEN_HOME is not needed nor required... just add it to the PATH...

the usage of this:

 <maven.compiler.source>17</maven.compiler.source>  <!-- Java version -->
<maven.compiler.target>17</maven.compiler.target>
Enter fullscreen mode Exit fullscreen mode

can be done easier via:

<maven.compiler.release>17</maven.compiler.release>
Enter fullscreen mode Exit fullscreen mode

in both cases. the supplemental configuration block for the maven-compiler-plugin can be omitted.

The mentioned goal is not correct because a goal is calling a plugin separately for example the surefire plugin like this: surefire:test but you meantioned in your list like clean, compile are life cycle phases ...(maven.apache.org/guides/introducti...)
Or the example you used at the beginning with the Archetype Plugin: mvn archetype:generate .. that is calling the maven-archetype-typeand goal generate of it...(maven.apache.org/archetype/maven-a...)

Collapse
 
ayshriv profile image
Ayush Shrivastava

Thank you for your feedback! You're absolutely right that setting up MAVEN_HOME is unnecessary, as adding Maven to the PATH suffices for most setups. It's a good point, and I'll make sure to clarify that in future posts.

Regarding the and properties, you're correct again! Using is a more concise and modern approach, and the extra configuration for the maven-compiler-plugin can be omitted as well. I'll update my example to reflect this improvement.

As for the goals and life cycle phases, I appreciate your observation. Goals like surefire:test indeed belong to specific plugins, whereas phases like clean and compile are part of Maven's life cycle. I see the confusion, and I’ll make the distinction clearer between life cycle phases and plugin-specific goals.

Thank you again for your insights—they'll help in refining the content!