Skip to main content

Maven Dependency Magic: Why Adding 2 Dependencies Downloads 50+ JARs (And Where They Go)

Β· 11 min read
Mahmut Salman
Software Developer

Have you ever added a single dependency to your pom.xml and wondered why Maven seems to download dozens of other libraries? Or why sometimes Maven doesn't download anything at all? This article demystifies Maven's dependency management, transitive dependencies, and the local cache system.

The Puzzle​

You just added two simple dependencies to your Spring Boot project:

<!-- pom.xml -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

You run mvn clean install and... nothing downloads? But when you check the dependency tree, you see 50+ JAR files are available!

What's happening? πŸ€”

The Mystery: You Added 2, But Got 50+​

Let's visualize what actually happened when you added those dependencies:

What YOU Added to pom.xml​

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

<!-- NEW: You added these two -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>

Your action: Added 2 dependencies (5 total)

Maven's action: Made ~50+ JAR files available to your project

How? Through the magic of transitive dependencies! 🎁

Understanding Maven Dependency Types​

Direct Dependencies (Explicit)​

These are dependencies YOU explicitly add to pom.xml:

Your pom.xml (5 dependencies):
β”œβ”€β”€ spring-boot-starter-web ← YOU added this
β”œβ”€β”€ spring-boot-devtools ← YOU added this
β”œβ”€β”€ spring-boot-starter-test ← YOU added this
β”œβ”€β”€ h2 ← YOU added this
└── spring-boot-starter-data-jpa ← YOU added this

Transitive Dependencies (Implicit)​

These are dependencies that YOUR dependencies need:

What Maven downloads automatically:
β”œβ”€β”€ h2 brings:
β”‚ └── h2-2.2.224.jar (just 1 JAR)
β”‚
└── spring-boot-starter-data-jpa brings:
β”œβ”€β”€ hibernate-core-6.3.1.jar ← JPA engine
β”œβ”€β”€ hibernate-commons-annotations ← Hibernate utilities
β”œβ”€β”€ spring-data-jpa-3.2.0.jar ← Repository magic
β”œβ”€β”€ jakarta.persistence-api.jar ← JPA standard
β”œβ”€β”€ jakarta.transaction-api.jar ← Transaction management
β”œβ”€β”€ spring-aop.jar ← Aspect programming
β”œβ”€β”€ aspectjweaver.jar ← AOP weaving
β”œβ”€β”€ byte-buddy.jar ← Code generation
β”œβ”€β”€ jandex.jar ← Annotation indexing
β”œβ”€β”€ jaxb-runtime.jar ← XML binding
└── ... (10+ more libraries!)

The Complete Dependency Tree​

Let's examine exactly what happens when you add JPA:

mvn dependency:tree

πŸ“¦ H2 Database (Simple)​

[INFO] +- com.h2database:h2:jar:2.2.224:runtime

Analysis:

  • βœ… Just ONE jar file
  • βœ… No transitive dependencies
  • βœ… Self-contained database engine

πŸ“¦ JPA Starter (Complex Gift Box)​

[INFO] +- org.springframework.boot:spring-boot-starter-data-jpa:jar:3.2.0
[INFO] | +- org.springframework.boot:spring-boot-starter-aop:jar:3.2.0
[INFO] | | +- org.aspectj:aspectjweaver:jar:1.9.20.1
[INFO] | +- jakarta.transaction:jakarta.transaction-api:jar:2.0.1
[INFO] | +- jakarta.persistence:jakarta.persistence-api:jar:3.1.0
[INFO] | +- org.hibernate.orm:hibernate-core:jar:6.3.1.Final
[INFO] | | +- org.jboss.logging:jboss-logging:jar:3.5.3.Final
[INFO] | | +- org.hibernate.common:hibernate-commons-annotations:jar:6.0.6.Final
[INFO] | | +- io.smallrye:jandex:jar:3.1.2
[INFO] | | +- net.bytebuddy:byte-buddy:jar:1.14.9
[INFO] | | +- jakarta.xml.bind:jakarta.xml.bind-api:jar:4.0.1
[INFO] | | +- jakarta.inject:jakarta.inject-api:jar:2.0.1
[INFO] | +- org.springframework.data:spring-data-jpa:jar:3.2.0
[INFO] | | +- org.springframework.data:spring-data-commons:jar:3.2.0
[INFO] | | +- org.springframework:spring-orm:jar:6.1.1
[INFO] | | +- org.springframework:spring-tx:jar:6.1.1
[INFO] | +- org.springframework:spring-aspects:jar:6.1.1

Analysis:

  • 🎁 ONE starter = 15+ libraries
  • πŸ”— Hierarchical dependency chain
  • ⚑ All coordinated versions (no conflicts!)

Visual Breakdown: The Gift Box Analogy​

πŸ“¦ spring-boot-starter-data-jpa (The Gift Box)
β”‚
β”œβ”€β”€ 🎁 Hibernate Package (Database ORM)
β”‚ β”œβ”€β”€ hibernate-core ................. The main JPA implementation
β”‚ β”œβ”€β”€ hibernate-commons-annotations ... Helper annotations
β”‚ β”œβ”€β”€ jandex ......................... Annotation indexer
β”‚ β”œβ”€β”€ byte-buddy ..................... Runtime code generation
β”‚ └── jboss-logging .................. Logging framework
β”‚
β”œβ”€β”€ 🎁 Spring Data Package (Repository Layer)
β”‚ β”œβ”€β”€ spring-data-jpa ................ Repository abstraction
β”‚ β”œβ”€β”€ spring-data-commons ............ Common data utilities
β”‚ β”œβ”€β”€ spring-orm ..................... ORM support
β”‚ └── spring-tx ...................... Transaction management
β”‚
β”œβ”€β”€ 🎁 JPA Standard Package (Interfaces)
β”‚ β”œβ”€β”€ jakarta.persistence-api ........ JPA specification
β”‚ β”œβ”€β”€ jakarta.transaction-api ........ Transaction API
β”‚ └── jakarta.inject-api ............. Dependency injection
β”‚
└── 🎁 AOP Package (Cross-cutting Concerns)
β”œβ”€β”€ spring-aop ..................... Spring AOP support
β”œβ”€β”€ spring-aspects ................. AspectJ integration
└── aspectjweaver .................. Aspect weaving

Each library has a purpose:

LibraryPurposeWhy Needed
hibernate-coreJPA implementationActual database ORM engine
spring-data-jpaRepository abstractionMagical repository interfaces
jakarta.persistence-apiJPA standardInterface definitions
spring-aopAspect-oriented programmingTransaction proxies
byte-buddyCode generationCreate dynamic proxies at runtime
aspectjweaverAspect weavingEnable @Transactional magic

The Maven Caching Mystery​

Why No Download Messages?​

You added dependencies and ran mvn clean install, but saw no download activity. Let's investigate:

# Check if H2 is cached locally
ls -lh ~/.m2/repository/com/h2database/h2/2.2.224/

Output:

total 5144
-rw-r--r-- 1 user staff 188B May 26 17:10 _remote.repositories
-rw-r--r-- 1 user staff 2.5M Sep 18 2023 h2-2.2.224.jar
-rw-r--r-- 1 user staff 6.8K Sep 18 2023 h2-2.2.224.pom
-rw-r--r-- 1 user staff 40B Sep 18 2023 h2-2.2.224.pom.sha1

🎯 AHA! Found it!

h2-2.2.224.jar    2.5M    Downloaded: Sep 18, 2023
Last used: May 26, 17:10

What this tells us:

  1. βœ… H2 was downloaded September 18, 2023 (probably for another project)
  2. βœ… Last checked: May 26 (Maven verified it's still valid)
  3. βœ… When you ran mvn clean install today, Maven said: "I already have this!"

Maven's Smart Caching Workflow​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ You: Add dependency to pom.xml β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Maven: Parse pom.xml and read dependencies β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Maven: Check local cache (~/.m2/repository/) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”
↓ ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ FOUND β”‚ β”‚NOT FOUND β”‚
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
↓ ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Use cached β”‚ β”‚Download from β”‚
β”‚ JAR file β”‚ β”‚Maven Central β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
↓ ↓
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Add to classpath β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The Local Maven Repository Structure​

~/.m2/repository/
β”œβ”€β”€ com/
β”‚ β”œβ”€β”€ h2database/
β”‚ β”‚ └── h2/
β”‚ β”‚ └── 2.2.224/
β”‚ β”‚ β”œβ”€β”€ h2-2.2.224.jar ← Actual library
β”‚ β”‚ β”œβ”€β”€ h2-2.2.224.pom ← Dependency metadata
β”‚ β”‚ β”œβ”€β”€ h2-2.2.224.pom.sha1 ← Checksum
β”‚ β”‚ └── _remote.repositories ← Download history
β”‚ β”‚
β”‚ └── fasterxml/
β”‚ └── jackson/
β”‚ └── core/
β”‚ └── jackson-databind/
β”‚ └── 2.15.3/
β”‚ └── jackson-databind-2.15.3.jar
β”‚
β”œβ”€β”€ org/
β”‚ β”œβ”€β”€ springframework/
β”‚ β”‚ β”œβ”€β”€ boot/
β”‚ β”‚ β”‚ └── spring-boot-starter-data-jpa/
β”‚ β”‚ β”‚ └── 3.2.0/
β”‚ β”‚ β”‚ β”œβ”€β”€ spring-boot-starter-data-jpa-3.2.0.jar
β”‚ β”‚ β”‚ └── spring-boot-starter-data-jpa-3.2.0.pom
β”‚ β”‚ β”‚
β”‚ β”‚ └── data/
β”‚ β”‚ └── spring-data-jpa/
β”‚ β”‚ └── 3.2.0/
β”‚ β”‚ └── spring-data-jpa-3.2.0.jar
β”‚ β”‚
β”‚ └── hibernate/
β”‚ └── orm/
β”‚ └── hibernate-core/
β”‚ └── 6.3.1.Final/
β”‚ └── hibernate-core-6.3.1.Final.jar
β”‚
└── jakarta/
└── persistence/
└── jakarta.persistence-api/
└── 3.1.0/
└── jakarta.persistence-api-3.1.0.jar

Structure Rules:

  • Path format: groupId/artifactId/version/
  • Example: com.h2database:h2:2.2.224 β†’ com/h2database/h2/2.2.224/
  • Each version has: .jar, .pom, .sha1, _remote.repositories

Deep Dive: What Each File Does​

The JAR File (h2-2.2.224.jar)​

# View contents of a JAR
jar tf ~/.m2/repository/com/h2database/h2/2.2.224/h2-2.2.224.jar | head -10
META-INF/
META-INF/MANIFEST.MF
org/h2/
org/h2/Driver.class
org/h2/engine/
org/h2/engine/Database.class
org/h2/store/
org/h2/store/FileStore.class
...

Purpose: The actual compiled code (bytecode) of the library

The POM File (h2-2.2.224.pom)​

<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>

<dependencies>
<!-- H2 has no dependencies! Self-contained. -->
</dependencies>
</project>

Purpose: Metadata about the library and its dependencies

The Checksum File (h2-2.2.224.jar.sha1)​

a2c7a2b7cc1f2a5e3c5f3c5d3e5f3c5d3e5f3c5a

Purpose: Verify file integrity (prevents corrupted downloads)

The Remote Repositories File (_remote.repositories)​

h2-2.2.224.jar>central=
h2-2.2.224.pom>central=

Purpose: Track which Maven repository the files came from

Real-World Examples​

Example 1: Brand New Dependency​

# Add a new dependency you've never used
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
</dependency>

# Run Maven
mvn clean install

Output:

[INFO] Downloading from central: https://repo.maven.apache.org/.../guava-32.1.3-jre.jar
[INFO] Downloaded from central: https://repo.maven.apache.org/.../guava-32.1.3-jre.jar (2.7 MB at 1.5 MB/s)

Result: Downloaded and cached for future use

Example 2: Previously Used Dependency​

# Same dependency, different project
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
</dependency>

# Run Maven
mvn clean install

Output:

[INFO] --- maven-dependency-plugin:3.6.1:tree ---
[INFO] +- com.google.guava:guava:jar:32.1.3-jre:compile

Result: Used cached version, no download! ⚑

Example 3: Checking Cache Size​

# See how much disk space Maven cache uses
du -sh ~/.m2/repository/

Typical output:

2.5G    /Users/username/.m2/repository/

What this means:

  • πŸ—„οΈ Gigabytes of libraries cached locally
  • ⚑ Instant access across all projects
  • πŸ’Ύ Trade-off: Disk space for speed

Understanding Spring Boot Starters​

What is a "Starter"?​

A starter is a curated set of dependencies bundled together for a specific purpose.

spring-boot-starter-data-jpa = "Everything you need for JPA"

Starter Anatomy​

<!-- What you write -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- What Spring Boot's POM contains -->
<dependencies>
<!-- Core JPA -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>

<!-- Spring Data -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>

<!-- JPA API -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
</dependency>

<!-- Transaction Management -->
<dependency>
<groupId>jakarta.transaction</groupId>
<artifactId>jakarta.transaction-api</artifactId>
</dependency>

<!-- AOP Support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>

<!-- And more... -->
</dependencies>

Common Spring Boot Starters​

StarterPurposeBrings In
spring-boot-starter-webWeb applicationsTomcat, Spring MVC, Jackson
spring-boot-starter-data-jpaDatabase ORMHibernate, Spring Data JPA
spring-boot-starter-securityAuthenticationSpring Security
spring-boot-starter-testTestingJUnit, Mockito, AssertJ
spring-boot-starter-validationInput validationHibernate Validator

Managing Maven Cache​

Viewing Cache Contents​

# List all cached artifacts
ls -R ~/.m2/repository/

# Count total JAR files
find ~/.m2/repository -name "*.jar" | wc -l

# Find largest JARs
find ~/.m2/repository -name "*.jar" -exec ls -lh {} \; | sort -k5 -hr | head -10

Clearing the Cache​

# Nuclear option: Delete entire cache
rm -rf ~/.m2/repository/

# Safer: Delete specific artifact
rm -rf ~/.m2/repository/com/h2database/h2/2.2.224/

# Maven will re-download on next build
mvn clean install

Cache Verification​

# Force Maven to re-download everything
mvn clean install -U

# -U flag = "update snapshots and check for newer releases"

Dependency Version Management​

Explicit Version​

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version> ← Explicit version
</dependency>

Inherited Version (Spring Boot)​

<!-- No version specified! -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>

<!-- Version comes from spring-boot-starter-parent -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>

Benefit: Spring Boot manages compatible versions automatically!

Troubleshooting Common Issues​

Issue 1: Dependency Not Found​

[ERROR] Failed to execute goal on project myapp:
Could not resolve dependencies for project com.example:myapp:jar:1.0.0:
Could not find artifact com.h2database:h2:jar:2.2.224

Solutions:

# 1. Check internet connection
ping repo.maven.apache.org

# 2. Clear cache and retry
rm -rf ~/.m2/repository/com/h2database/
mvn clean install

# 3. Check Maven settings
cat ~/.m2/settings.xml

Issue 2: Version Conflicts​

[WARNING] The POM for org.hibernate:hibernate-core:jar:6.3.1.Final is missing

Solution: Use dependency management

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.3.1.Final</version>
</dependency>
</dependencies>
</dependencyManagement>

Issue 3: Slow Downloads​

# Use Maven mirror (e.g., Aliyun in China)
# Add to ~/.m2/settings.xml
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
</mirrors>

Best Practices​

βœ… Do This​

1. Let Spring Boot manage versions

<!-- Good: No version needed -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>

2. Use dependency:tree to understand transitive dependencies

mvn dependency:tree > dependencies.txt

3. Exclude unwanted transitive dependencies

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>

4. Periodically clean old versions

# Remove all but latest versions
mvn dependency:purge-local-repository

❌ Avoid This​

1. Hardcoding versions when using Spring Boot

<!-- Bad: Might conflict with Spring Boot's managed version -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.0</version> ← Avoid this!
</dependency>

2. Ignoring dependency conflicts

[WARNING] Some problems were encountered while building the effective model

3. Committing .m2/repository to Git

# This is ALWAYS in .gitignore
~/.m2/repository/

Verification Commands Cheat Sheet​

# View dependency tree
mvn dependency:tree

# Show only direct dependencies
mvn dependency:tree -Dverbose=false

# Find specific dependency
mvn dependency:tree | grep h2

# Analyze dependency conflicts
mvn dependency:analyze

# List all dependencies (including transitive)
mvn dependency:list

# Copy all dependencies to target/dependency/
mvn dependency:copy-dependencies

# Show classpath
mvn dependency:build-classpath

# Verify all dependencies are in cache
mvn dependency:resolve

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

Summary​

Key Takeaways​

  1. 🎁 Starters are gift boxes - One starter brings many libraries
  2. πŸ—„οΈ Maven caches everything - ~/.m2/repository/ stores all downloads
  3. ⚑ Cache = Speed - No re-download if already cached
  4. πŸ”— Transitive dependencies - Dependencies have dependencies
  5. πŸ“Š Use dependency:tree - Understand what you're actually using

The Maven Dependency Lifecycle​

Add to pom.xml
↓
Check cache (~/.m2/repository/)
↓
Download if missing
↓
Store in cache
↓
Add to classpath
↓
Available in your code

What You've Learned​

  • βœ… Why adding 2 dependencies brings 50+ JARs
  • βœ… How Maven's local repository works
  • βœ… Why sometimes nothing downloads (cache hit!)
  • βœ… What Spring Boot starters actually contain
  • βœ… How to inspect and manage dependencies

Mental Model​

Maven is like a smart librarian:

  • πŸ“š Keeps a local copy of every book (cache)
  • πŸ” Checks the local shelf first (cache lookup)
  • πŸ“₯ Only orders new books if missing (download)
  • πŸ“¦ When you borrow one book, brings all related books (transitive dependencies)

Further Reading​


Next time you add a dependency, remember:

  • One dependency can bring dozens of others
  • Maven caches everything locally
  • mvn dependency:tree is your friend
  • Spring Boot starters save you from dependency hell!

Tags: #maven #spring-boot #dependencies #java #build-tools #caching #transitive-dependencies