This repository demonstrates the most common Maven issues with working examples and fixes.
1. Wrong Scopes
- Test libraries in production JARs
- Server-provided libraries included
- Runtime dependencies at compile time
- Examples: JUnit as compile, Servlet API missing provided scope
- Missing
<dependencyManagement>
section - Version conflicts between related libraries
- Inconsistent versions across modules
- Examples: Mixed Spring versions, missing SLF4J version
- Different libraries bringing conflicting versions
- Runtime ClassNotFoundException errors
- API breaking changes
- Examples: SLF4J 1.7 vs 2.0, Guava version conflicts
- Same artifact with different versions
- Multiple libraries doing same thing
- Bloated classpath and JAR size
- Examples: Multiple JSON libraries, logging implementations
- Missing plugin versions (uses Maven defaults)
- Outdated plugin versions
- Inconsistent behavior across environments
- Examples: Compiler plugin without version, old JAR plugin
- Modules depending on each other in circles
- Build failures and compilation loops
- Architecture problems
- Examples: Module A ↔ Module B dependency cycle
- Direct dependencies forcing inheritance
- Missing dependency/plugin management
- Version conflicts between parent/children
- Examples: Forced Spring inheritance, hardcoded Java 8
- Wrong module build order
- Version drift between sibling modules
- Hardcoded inter-module versions
- Examples: Dependencies built before their dependencies
Each issue directory contains:
pom.xml
- Problematic configurationpom-fixed.xml
orfixed/
- Correct solutionREADME.md
- Detailed explanation and commands
# Try to build the problematic examples (they will fail/conflict)
cd issue1-wrong-scopes && mvn clean compile
# Build the fixed versions (they work correctly)
cd issue1-wrong-scopes/fixed && mvn clean compile
# Show dependency tree
mvn dependency:tree
# Find conflicts
mvn dependency:analyze
# Check for updates
mvn versions:display-dependency-updates
mvn versions:display-plugin-updates
# Validate configuration
mvn validate
# Show effective POM
mvn help:effective-pom
- Use Dependency Management: Central version control without forced inheritance
- Correct Scopes: test, provided, runtime, compile appropriately
- Plugin Versions: Always specify plugin versions explicitly
- BOM Imports: Use framework BOMs for consistent versions
- Multi-module Order: Build foundation modules first
- Avoid Circles: Design clear dependency hierarchies
- Version Consistency: Use properties and
${project.version}
- Replace
<dependencies>
with<dependencyManagement>
in parent POMs - Add
<exclusions>
to resolve transitive conflicts - Use
${project.version}
for inter-module dependencies - Import BOMs with
<type>pom</type><scope>import</scope>
- Add
<pluginManagement>
for consistent plugin versions - Extract common interfaces to break circular dependencies