Dependencies Management

Managing libraries and their versions in Maven

← Back to Index

What are Dependencies?

Dependencies are external libraries (JAR files) that your project needs to compile and run.

Transitive Dependencies: If you add library A, and A needs library B, Maven automatically downloads B too!

Adding Dependencies

<dependencies>
    <!-- Basic dependency -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>3.2.0</version>
    </dependency>

    <!-- Test dependency -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.10.0</version>
        <scope>test</scope>
    </dependency>

    <!-- Optional dependency -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <optional>true</optional>
    </dependency>
</dependencies>

Dependency Scopes

Scope Compile Test Runtime Packaged Use Case
compile Yes Yes Yes Yes Default, most deps
provided Yes Yes No No Servlet API (server provides)
runtime No Yes Yes Yes JDBC drivers
test No Yes No No JUnit, Mockito
system Yes Yes No No Local JAR (avoid!)
<!-- Examples -->
<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.0.0</version>
    <scope>provided</scope>  <!-- Tomcat provides this -->
</dependency>

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.6.0</version>
    <scope>runtime</scope>  <!-- Not needed at compile time -->
</dependency>

Dependency Management

<!-- Parent POM - define versions centrally -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>6.1.0</version>
            <type>pom</type>
            <scope>import</scope>  <!-- Import BOM -->
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- Child POM - no version needed! -->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <!-- Version from BOM -->
    </dependency>
</dependencies>

Excluding Transitive Dependencies

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- Exclude Tomcat to use Jetty instead -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- Add Jetty instead -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

Useful Commands

# Show dependency tree
mvn dependency:tree

# Show tree for specific artifact
mvn dependency:tree -Dincludes=org.springframework

# Find unused dependencies
mvn dependency:analyze

# Download sources and javadocs
mvn dependency:sources
mvn dependency:resolve -Dclassifier=javadoc

# Check for updates
mvn versions:display-dependency-updates

Finding Dependencies

Maven Central Search: search.maven.org

Search for any library, copy the dependency XML, paste into your pom.xml!

Summary

  • Dependencies: External libraries in <dependencies>
  • Scopes: compile, provided, runtime, test
  • Transitive: Maven downloads dependencies of dependencies
  • Exclusions: Remove unwanted transitive deps
  • DependencyManagement: Centralize versions
  • BOM: Bill of Materials for version management