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