Backend Development 22 min read

Comprehensive Maven Guide: Configuration, Dependency Management, Modules, Plugins, and Build Settings

This article provides a detailed tutorial on Maven, covering basic project configuration, repository setup, POM structure, dependency declaration and scopes, indirect dependencies, exclusions, variable properties, multi‑module management, unified dependency management, essential plugins such as jar, assembly and shade, as well as build settings like compiler version, resource exclusion, and main‑class definition.

Top Architect
Top Architect
Top Architect
Comprehensive Maven Guide: Configuration, Dependency Management, Modules, Plugins, and Build Settings

Maven is a project management and build tool for Java applications that simplifies dependency handling and project construction.

1. Basic Configuration

Repositories: Maven downloads dependencies from the central repository and can be configured to use private repositories.

A minimal POM includes groupId , artifactId and version elements.

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>xyz.ibudai</groupId>
    <artifactId>maven-demo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <description>This is maven demo.</description>
</project>

2. Dependency Management

Dependencies are added with the dependencies tag; common scopes (compile, provided, runtime, test, system, import) are explained.

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.27</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

Indirect dependencies are resolved automatically; Maven selects the nearest definition and applies conflict‑resolution rules.

Exclusions are performed with the excludes tag, and optional dependencies with the optional tag.

<dependency>
    <groupId>xyz.ibudai</groupId>
    <artifactId>demo-a</artifactId>
    <version>1.0.0</version>
    <excludes>
        <exclude>
            <groupId>xyz.ibudai</groupId>
            <artifactId>dependency-b</artifactId>
        </exclude>
    </excludes>
</dependency>

Version variables can be defined in properties and referenced with ${} .

<properties>
    <mysql.version>8.0.30</mysql.version>
    <junit.version>4.13.2</junit.version>
</properties>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>

3. Module Configuration

Multi‑module projects use the modules tag; child modules inherit the parent’s groupId , artifactId and version via the parent element.

<modules>
    <module>module-1</module>
    <module>module-2</module>
</modules>
<parent>
    <groupId>xyz.ibudai</groupId>
    <artifactId>maven-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath>
</parent>

4. Unified Management

Common dependencies are placed in the parent’s dependencyManagement section and referenced in child modules without specifying versions.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
    </dependencies>
</dependencyManagement>

5. Plugin Management

Key plugins include maven-jar-plugin for manifest customization, maven-assembly-plugin for creating fat JARs, and maven-shade-plugin for advanced shading and package relocation.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.1</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>org.example.MyTest</mainClass>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <manifestEntries>
                    <Plugin-Id>demo-plugin</Plugin-Id>
                    <Plugin-Version>1.0.0</Plugin-Version>
                </manifestEntries>
            </manifest>
        </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>${project.artifactId}-${project.version}-all</finalName>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <minimizeJar>true</minimizeJar>
        <artifactSet>
            <includes>
                <include>com.fasterxml.jackson.core:jackson-core</include>
            </includes>
        </artifactSet>
        <relocations>
            <relocation>
                <pattern>com.fasterxml.jackson.core</pattern>
                <shadedPattern>com.ibudai.fasterxml.jackson.core</shadedPattern>
            </relocation>
        </relocations>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/license/**</exclude>
                    <exclude>META-INF/*</exclude>
                    <exclude>LICENSE</exclude>
                    <exclude>NOTICE</exclude>
                </excludes>
            </filter>
        </filters>
    </configuration>
</plugin>

6. Build Configuration

The compiler plugin sets the Java source and target versions.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>8</source>
        <target>8</target>
    </configuration>
</plugin>

Resources can be excluded from the final JAR, for example application.yml .

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <excludes>
            <exclude>application.yml</exclude>
        </excludes>
    </resource>
</resources>

The main class is defined to make the JAR executable.

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <mainClass>xyz.ibudai.TestWebApplication</mainClass>
        <layout>JAR</layout>
    </configuration>
</plugin>

The article also contains promotional messages unrelated to Maven, which are not part of the technical guide.

Javabackend developmentdependency managementMavenBuild ToolsPlugins
Top Architect
Written by

Top Architect

Top Architect focuses on sharing practical architecture knowledge, covering enterprise, system, website, large‑scale distributed, and high‑availability architectures, plus architecture adjustments using internet technologies. We welcome idea‑driven, sharing‑oriented architects to exchange and learn together.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.