> ## Content Index
> Fetch the complete content index at: https://www.javahandbook.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Understanding pom.xml
- URL: https://www.javahandbook.com/maven-course/understanding-pom-xml/
- Published: 2025-08-09T04:50:04.000Z
- Updated: 2025-08-20T02:46:10.000Z
- Description: 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.
- Author: Gopi Gorantala
- Tags: Maven Fundamentals, #docs, #maven-course

## **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:

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

    <!-- 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:**

```xml
<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**.

```xml
<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.

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

```xml
<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:

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