{ "@context": "https://schema.org", "@graph": [ { "@type": "WebSite", "@id": "https://www.ggorantala.dev/#website", "url": "https://www.ggorantala.dev/", "name": "Gopi Gorantala", "description": "Staff engineer building Kafka and Flink platforms for banking. Production failures traced to root cause." }, { "@type": "Person", "@id": "https://www.ggorantala.dev/#person", "name": "Gopi Gorantala", "url": "https://www.ggorantala.dev/", "jobTitle": "Staff Software Engineer", "worksFor": { "@type": "Organization", "name": "ING Bank" }, "sameAs": [ "https://x.com/ggorantala", "https://www.linkedin.com/in/ggorantala/", "https://github.com/ggorantala", "https://leetcode.com/ggorantala" ] } ] }
Skip to content

Understanding pom.xml

Master Maven pom.xml: Learn GAV coordinates, dependencies, plugins, and build configuration. Complete guide to Project Object Model structure for Java developers. Essential Maven tutorial.

Maven Fundamentals
Gopi Gorantala

Introduction

In Apache Maven, POM stands for Project Object Model. It’s the heart of any Maven project and is defined in a file called pom.xml located at the project’s root directory.

The pom.xml file contains all the project configuration details, including:

  • GAV coordinates (GroupId, ArtifactId, Version)
  • Dependencies and their versions
  • Build settings
  • Plugins for additional tasks
  • Custom properties for reuse

Understanding the POM is critical because Maven uses it to:

  • Identify your project uniquely
  • Resolve dependencies automatically
  • Define build lifecycle and customization

1. The Structure of POM.xml

A basic Maven pom.xml might look like this:

<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>

    <!-- GAV -->
    <groupId>com.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>My Maven Application</name>
    <description>Sample Maven project for demonstration</description>
    
</project>

2. GAV – GroupId, ArtifactId, Version

These three elements uniquely identify a Maven project:

Element Description
groupId Unique identifier for your project’s organization or company (e.g., com.example, org.apache.maven)
artifactId The name of the project or module (e.g., my-app, payment-service)
version The version of the artifact being built (e.g., 1.0.0, 1.0.0-SNAPSHOT)

Example:

<groupId>com.javahandbook</groupId>
<artifactId>maven-tutorial</artifactId>
<version>1.0.0</version>

📌 Note: Together, GAV acts like a coordinate system for Maven to fetch or publish artifacts in repositories.

3. Properties in POM.xml

Properties allow you to define reusable values in your POM.
They’re especially useful for version management and build customization.

<properties>
    <java.version>17</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <spring.boot.version>3.1.0</spring.boot.version>
</properties>

You can reference these properties anywhere in your POM using ${property.name}.

4. Dependencies

Dependencies are libraries your project needs to compile, test, or run.
They are declared in the <dependencies> section.

<dependencies>
    <!-- Example: Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${spring.boot.version}</version>
    </dependency>
</dependencies>

Dependency Scopes

  • compile (default) – Required for compilation and runtime
  • provided – Required for compilation but provided at runtime (e.g., servlet API in Tomcat)
  • runtime – Needed only at runtime, not for compilation
  • test – Used only for testing (e.g., JUnit)

5. Plugins

Maven uses plugins to extend its capabilities. Plugins define goals that can be executed during the build lifecycle.

Example: Compiler Plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.10.1</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Other popular plugins:

  • maven-surefire-plugin – Runs unit tests
  • maven-jar-plugin – Creates JAR files
  • maven-shade-plugin – Creates fat/uber JARs

6. Build Section

The <build> section in POM defines:

  • Plugins and their configurations
  • The output directory for compiled code
  • Custom build profiles

Example:

<build>
    <finalName>my-app</finalName>
    <plugins>
        <!-- Plugins go here -->
    </plugins>
</build>

Best Practices for POM.xml

✅ Keep dependency versions in <properties> for easy upgrades
✅ Use dependencyManagement in parent POMs for version control in multi-module projects
✅ Remove unused dependencies to speed up builds
✅ Use meaningful GAV coordinates to avoid conflicts

Key Takeaways

  • pom.xml is the blueprint of a Maven project
  • GAV uniquely identifies your project in repositories
  • Properties help with reusability and maintainability
  • Dependencies and plugins define what your project needs to run and how it builds
  • The build section customizes Maven’s lifecycle for your needs
Maven Fundamentals

Staff engineer architecting Kafka and Flink platforms for banking, where a dropped event is a reconciliation break, not a retry. Through javahandbook.com, I share production-tested guidance on building reliable event-driven systems.

Comments