<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: purewater02</title>
    <description>The latest articles on DEV Community by purewater02 (@pw_dev_77cd4ebd591e47b410).</description>
    <link>https://dev.to/pw_dev_77cd4ebd591e47b410</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3991062%2Fb4a49748-f7a2-4414-8a0d-bf002bd82bf6.png</url>
      <title>DEV Community: purewater02</title>
      <link>https://dev.to/pw_dev_77cd4ebd591e47b410</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pw_dev_77cd4ebd591e47b410"/>
    <language>en</language>
    <item>
      <title>Spring Boot 3 migration: I built a local CLI that generates risk estimates in minutes</title>
      <dc:creator>purewater02</dc:creator>
      <pubDate>Sun, 21 Jun 2026 18:26:36 +0000</pubDate>
      <link>https://dev.to/pw_dev_77cd4ebd591e47b410/spring-boot-3-migration-i-built-a-local-cli-that-generates-risk-estimates-in-minutes-223k</link>
      <guid>https://dev.to/pw_dev_77cd4ebd591e47b410/spring-boot-3-migration-i-built-a-local-cli-that-generates-risk-estimates-in-minutes-223k</guid>
      <description>&lt;h1&gt;
  
  
  Spring Boot 3 migration: I built a local CLI that generates risk estimates in minutes
&lt;/h1&gt;

&lt;p&gt;Spring Boot 3 is not just another dependency bump.&lt;/p&gt;

&lt;p&gt;For many teams, the upgrade from Spring Boot 2.x to 3.x bundles several migrations at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java 17+ baseline&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;javax.*&lt;/code&gt; → &lt;code&gt;jakarta.*&lt;/code&gt; namespace migration&lt;/li&gt;
&lt;li&gt;Spring Security 5 → 6 configuration changes&lt;/li&gt;
&lt;li&gt;Hibernate 5 → 6 compatibility risks&lt;/li&gt;
&lt;li&gt;dependency coordinate updates&lt;/li&gt;
&lt;li&gt;CI/runtime surprises&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hard question usually comes before implementation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What will break, how risky is it, and how many sprints should we reserve?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I built &lt;strong&gt;Spring Upgrade Radar&lt;/strong&gt; as a local-first CLI and GitHub Action to answer that planning question.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Spring Upgrade Radar scans a Spring Boot Maven/Gradle project and generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Executive summary for CTOs, EMs, tech leads, and backend teams&lt;/li&gt;
&lt;li&gt;Risk score and migration readiness grade&lt;/li&gt;
&lt;li&gt;Top migration risks ranked by impact&lt;/li&gt;
&lt;li&gt;Estimated sprint-by-sprint roadmap&lt;/li&gt;
&lt;li&gt;Recommended migration backlog&lt;/li&gt;
&lt;li&gt;Ticket exports for JSON, Jira CSV, and GitHub Issues Markdown&lt;/li&gt;
&lt;li&gt;Markdown and HTML reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not automatic rewriting. The goal is to give teams a practical first estimate before they start a migration project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why local-first matters
&lt;/h2&gt;

&lt;p&gt;Your source code does not need to leave your machine.&lt;/p&gt;

&lt;p&gt;Many teams cannot upload production code to a hosted SaaS scanner. Spring Upgrade Radar runs locally, in your own CI, or on a private runner. The default workflow generates a full report without uploading source code anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this helps before AI coding agents
&lt;/h2&gt;

&lt;p&gt;Spring Upgrade Radar can also be used as a deterministic preflight step.&lt;/p&gt;

&lt;p&gt;Instead of letting an LLM explore the codebase from scratch, run the CLI or GitHub Action first. The tool produces a risk map, estimated roadmap, and migration ticket backlog. That structured plan becomes the starting context for your coding agent, reducing token spend on repeated discovery and letting the LLMfocus on implementation and review.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Action usage
&lt;/h2&gt;

&lt;p&gt;The v0.1.1 release is available as a free GitHub Action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Spring Upgrade Radar&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**/pom.xml"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**/build.gradle"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**/*.java"&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-python@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.11"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;purewater02/spring-upgrade-radar@v0.1.1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;project-path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;."&lt;/span&gt;
          &lt;span class="na"&gt;target-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.5"&lt;/span&gt;
          &lt;span class="na"&gt;output-dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spring-upgrade-radar-output"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;spring-upgrade-radar-report&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;spring-upgrade-radar-output/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Local CLI quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/purewater02/spring-upgrade-radar.git
&lt;span class="nb"&gt;cd &lt;/span&gt;spring-upgrade-radar
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;.&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

spring-upgrade-radar scan /path/to/your/spring-project &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target&lt;/span&gt; 3.5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; out/report.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--html-output&lt;/span&gt; out/report.html &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tickets-json&lt;/span&gt; out/tickets.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--jira-csv&lt;/span&gt; out/jira.csv &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--github-issues-md&lt;/span&gt; out/github-issues.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example output
&lt;/h2&gt;

&lt;p&gt;A report starts with an executive summary like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Executive Summary&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Spring Boot: 2.6.2 → 3.5
&lt;span class="p"&gt;-&lt;/span&gt; Java: 8
&lt;span class="p"&gt;-&lt;/span&gt; Risk score: 100/100 | Grade: C (Critical)

&lt;span class="gu"&gt;## Top 3 Risks&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; Spring Boot 2.x → 3.x major migration
&lt;span class="p"&gt;2.&lt;/span&gt; Java 17 baseline gap
&lt;span class="p"&gt;3.&lt;/span&gt; JPA javax.persistence imports

&lt;span class="gu"&gt;## Estimated Roadmap&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Sprint 1: Java 17+ build/runtime baseline — Estimated Time: 2 weeks
&lt;span class="p"&gt;-&lt;/span&gt; Sprint 2: javax → jakarta namespace migration — Estimated Time: 2 weeks
&lt;span class="p"&gt;-&lt;/span&gt; Sprint 3: dependency major upgrades — Estimated Time: 2 weeks
&lt;span class="p"&gt;-&lt;/span&gt; Sprint 4: Spring Boot 3.x migration validation — Estimated Time: 1 week
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full report includes evidence for each finding and exportable tickets for Jira and GitHub Issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current check scope
&lt;/h2&gt;

&lt;p&gt;v0.1.1 intentionally starts narrow. Current checks include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot 2.x → 3.x migration risk&lt;/li&gt;
&lt;li&gt;Java baseline compatibility&lt;/li&gt;
&lt;li&gt;Jakarta Persistence import migration (&lt;code&gt;javax.persistence&lt;/code&gt; → &lt;code&gt;jakarta.persistence&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Spring Security legacy configuration patterns&lt;/li&gt;
&lt;li&gt;JSP/JSTL Jakarta compatibility risks&lt;/li&gt;
&lt;li&gt;MySQL Connector/J coordinate migration&lt;/li&gt;
&lt;li&gt;Wrapper and CI execution readiness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More checks will be added in later releases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Landing page: &lt;a href="https://purewater02.github.io/spring-upgrade-radar/" rel="noopener noreferrer"&gt;https://purewater02.github.io/spring-upgrade-radar/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub repo: &lt;a href="https://github.com/purewater02/spring-upgrade-radar/" rel="noopener noreferrer"&gt;https://github.com/purewater02/spring-upgrade-radar/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sample report: &lt;a href="https://purewater02.github.io/spring-upgrade-radar/sample-report-SpringBoot_JPA_Blog_Prj.md" rel="noopener noreferrer"&gt;https://purewater02.github.io/spring-upgrade-radar/sample-report-SpringBoot_JPA_Blog_Prj.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Migration checklist article: &lt;a href="https://purewater02.github.io/spring-upgrade-radar/articles/spring-boot-27-to-3x-migration-checklist.html" rel="noopener noreferrer"&gt;https://purewater02.github.io/spring-upgrade-radar/articles/spring-boot-27-to-3x-migration-checklist.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Feedback wanted
&lt;/h2&gt;

&lt;p&gt;This is an early v0.1.1 release. I am especially interested in feedback from teams that have already done, or are currently planning, Spring Boot 3 migrations.&lt;/p&gt;

&lt;p&gt;Useful feedback would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which migration risks are missing?&lt;/li&gt;
&lt;li&gt;Which report sections are actually useful for planning?&lt;/li&gt;
&lt;li&gt;Would your team use this in CI before starting an upgrade?&lt;/li&gt;
&lt;li&gt;What output format would make adoption easier?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it on a real project, please open a GitHub issue or discussion. Real-world migration edge cases are exactly what will make the next versions better.&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>java</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
