Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dependency Management for Java - Seattle 2025-1...
Search
sullis
November 18, 2025
Programming
53
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Dependency Management for Java - Seattle 2025-11-18
Dependency Management for Java
Seattle Java User Group
2025-11-18
#seajug
sullis
November 18, 2025
More Decks by sullis
See All by sullis
Dependency Management for Java - Code Remix Summit 2026-05-12
sullis
0
62
AI Assisted Software Development - Portland Java User Group - 2026-04-14
sullis
0
76
Dependency Management for Java - Portland - 2025-11-04
sullis
0
36
Dependency management for Java applications 2025-09-11
sullis
0
56
S3 NYC Iceberg meetup 2025-07-10
sullis
0
63
Amazon S3 Chicago 2025-06-04
sullis
0
150
Amazon S3 Boston 2025-05-07
sullis
0
110
Netty ConFoo Montreal 2025-02-27
sullis
0
180
GitHub Actions ConFoo Montreal 2025-02-26
sullis
0
120
Other Decks in Programming
See All in Programming
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
120
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
420
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
270
act1-costs.pdf
sumedhbala
0
240
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.2k
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
900
継続モナドとリアクティブプログラミング
yukikurage
3
630
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
1
750
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
650
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
230
数百円から始めるRuby電子工作
tarosay
0
100
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
A designer walks into a library…
pauljervisheath
211
24k
KATA
mclloyd
PRO
35
15k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
470
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
350
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
190
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
880
Measuring & Analyzing Core Web Vitals
bluesmoon
9
900
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Transcript
None
About me Portland Oregon Java since 1996 open source contributor
None
🟢 hundreds of libraries on the classpath 🟢 open source
libraries 🟢 internal libraries Modern Java applications
What is the worst that could happen? Outdated libraries on
your production classpath
None
2017 US House committee Equifax CEO US Rep Greg Walden
2017 US House committee US Rep Greg Walden “the Apache
Struts software which contained the vulnerability that led to this breach was running on the Equifax system”
Greenfield project
Java dependency conflicts
Gradle blog November 2019 “The larger the project and its
dependency graph, the harder it is to maintain”
“Dependency issues can cause many problems” Gradle blog November 2019
“If you are lucky, you would get a compile time
error” Gradle blog November 2019
“it is common to only see problems occurring when executing
tests or even at production runtime” Gradle blog November 2019
NoClassDefFoundError ClassNotFoundException
NoSuchMethodError NoSuchFieldError
UnsatisfiedLinkError AbstractMethodError
Let’s talk about dependency resolution
dependencies { implementation( “foo:liba:1.5.2” ) implementation( “foo:libz:0.2.1” ) implementation( “com.google.guava:guava:28.2”
) }
liba 1.5.2 app 1.0.0 libz 0.2.1 guava 19.0 guava 33.4.8
guava 28.2
liba 1.5.2 app 1.0.0 libz 0.2.1 guava 19.0 guava 33.4.8
guava 28.2
Maven: “nearest wins” Gradle: “highest version wins” guava 28.2 guava
33.4.8
Jake Wharton - March 2024 https://jakewharton.com/nonsensical-maven-is-still-a-gradle-problem/
“Maven’s dependency resolution strategy is objectively bonkers” Jake Wharton -
March 2024 https://jakewharton.com/nonsensical-maven-is-still-a-gradle-problem/
Java classpath
what Java libraries do you have in production right now?
do you have outdated libraries in production?
do you have SNAPSHOT libraries in production?
Microservice app:1.5.2 sharedlib:1.8.3 swagger-annotations:2.2.31-SNAPSHOT
“Let’s add one more Java library ” Java library
None
Dependency Hell
Dependency Hell is a common problem
Dependency Hell @ gilt.com (2015)
Dependency Hell @ Netflix (2017)
Taming dependency hell
Pin dependency to a specific version?
configurations.all { resolutionStrategy { force 'com.example:foobar:0.9.2' } }
Mike McGarr Netflix, 2017
Gradle User Guide
“Gradle’s optimistic dependency resolution may inadvertently upgrade dependencies, causing compatibility
issues” Gradle User Guide
Gradle User Guide
Gradle User Guide
Gradle User Guide
Gradle User Guide
Gradle User Guide
Google JLBP
Google JLBP “Google Best Practices for Java Libraries are rules
that minimize problems for consumers of interconnected Java libraries“ jlbp.dev
JLBP-1 Minimize Dependencies “Scrutinize all dependency additions”
JLBP-1 Minimize Dependency Scope “When you do add a dependency,
keep it scoped as narrowly as possible”
JLBP-1 “Prefer JDK classes where available” “For any given functionality,
pick exactly one library”
JLBP-1 Separate the tool classpath from the product classpath
JLBP-11 Keep dependencies up to date
JLBP-11 “Release no later than 6 weeks after any of
your dependencies releases a higher version”
JLBP-11 “Staying up to date is also important to ensure
that security fixes are rolled out promptly”
JLBP-15 Publish a BOM for multi-module projects
JLBP-16 Ensure upper version alignment of dependencies for consumers
JLBP-16 “The version of each dependency added to the classpath
should the highest version in the dependency tree”
Common problems with Java dependencies
Compilation failure [ERROR] bad class file: /Users/skywalker/.m2/repository/org/apache/iceberg/iceberg-api/1.9. 2/iceberg-api-1.9.2.jar(org/apache/iceberg/IcebergBuild.class) [ERROR] class
file has wrong version 55.0, should be 52.0
class file has wrong version 61.0, should be 52.0
Dependency misalignment jackson-databind:2.19.2 jackson-core:2.19.0
Scala sadness jackson-module-scala_2.12-2.19.2.jar jackson-module-scala_2.13-2.19.2.jar 🚩 what if both of these
jars are on the classpath?
🔵 dependencyConvergence 🔵 requireUpperBoundDeps 🔵 banDuplicateClasses Maven Enforcer plugin
Gradle Enforcer plugin
Let’s talk about OpenRewrite
OpenRewrite recipes 🟢 AddDependency 🟢 RemoveDependency 🟢 ChangeDependency 🟢 UpgradeDependencyVersion
Let’s talk about Jackson
Real world scenario Jackson 2.x → Jackson 3.x
Jackson library
Jackson upgrade demo
GitHub Copilot Agent
GitHub Copilot Agent
OpenRewrite recipe
Final thoughts
🟢 Build often 🟢 Release often 🟢 Ownership 🟢 consider
OpenRewrite for complex migrations
Questions?
The End
Bonus
Let’s talk about Netty
Netty dependencies 🔵 some Netty artifacts are platform dependent 🔵
use artifact classifiers
Example: artifact <classifier> Linux x86
Linux ARM 64 Example: artifact <classifier>
DPE Summit 2025: From Lag to Lightning Aubrey Chipman and
Roberto Perez Alcolea
JConf 2022 : Dependency management Roberto Perez Alcolea
Devnexus 2021 Taming Java Dependencies @ Google Stephanie Wang
David Handermann [ exceptionfactory.com ]
Let’s talk about JCenter
JCenter repository end-of-life
None
“At the end of the sunset, all JCenter requests will
automatically be redirected to Maven Central and served from there.”
Forcing gradle to check for updated versions ./gradlew build --refresh-dependencies
None
None