Jak děláme aktualizace v Java projektech s OpenRewrite
13.11.2025 • Marek Véle
Jako poslední část série o tom jak udržovat aplikace jako nové bych chtěl představit nástroj OpenRewrite, zaměřený především na údržbu Java projektů.
Tento nástroj najde využití především při:
- upgradech knihoven použitých v kódu a běhových platforem, zvlášť pokud jde o změny ovlivňující velkou část kódu aplikace (třeba verze Spring nebo Javy)
- nahrazení nějaké použité knihovny jinou, i se souvisejícími změnami v kódu
- menší změny, které chcete provést jednotně napříč více aplikacemi
- nahrazení částí kódu citlivých na známé zranitelnosti
Nejvíce podporovanými jazyky jsou:
- Java a další kompatibilní s Java Virtual Machine (Kotlin, Gradle,...)
- JavaScript/TypeScript (hodí se hlavně pro přesnější transformace TypeScriptu)
- konfigurační a přenosové formáty (např. YAML, JSON, XML)
OpenRewrite můžete dokonce použít i na spouštění javascriptových codemod transformací, ale to dává smysl jenom pokud máte frontendový JavaScript kód a backendový Java kód v jednom repozitáři. Obvyklé spouštění nástroje totiž probíhá přes buildovací nástroje Javy - Gradle nebo Maven.
Pro úpravy kódu je použitá obvyklá technika převodu psaného kódu na stromovou strukturu, v případě OpenRewrite ale zachází mnohem dále. Struktura do které je kód načítán totiž zahrnuje i veškeré typové informace o jednotlivých částech kódu (proměnných, metodách, třídách...). Dokonce obsahuje i kompletní informace o formátování, tedy mezerách, odřádkování a podobně.
Výrobce nástroje, společnost Moderne, tuto strukturu nazývá LST - bezztrátový semantický strom, tedy model uchovávající nejen strukturu ale i význam vazeb v kódu. Důsledkem této odlišnosti od častěji používaného AST (abstraktního syntaktického stromu) je o několik řádů vyšší komplexnost stromové struktury a množství uzlů.
Jaké jsou hlavní benefity tohoto přístupu?
- možnost přesnějšího cílení transformací nejen podle toho CO chcete změnit, ale i v jakých situacích, tedy KDE
- schopnost přesné rekonstrukce kódu zpětně z LST
- zachování formátování kódu podle vašeho stylu
Tyto přínosy jsou vyvážené obtížností hlavně zpočátku zaměřit ten správný „uzel“ stromu a kontext k provedení úprav.
Nástroj pracuje s konceptem „receptů“. Recept je z základní podobě Java třída provádějící nějaké změny v kódu, kterou můžete prostřednictvím nástroje OpenRewrite samostatně spustit. Je možné, a i obvyklé, recepty skládat do celých sad receptů. Taková sada receptů je sama také „recept“ a je tedy možné poskládat výslednou sadu změn kterou aplikujete z libovolné kompozice jednotlivých receptů i sad receptů.
V současnosti jsou k dispozici tři druhy receptů z pohledu dostupnosti a možného použití:
- open-source - recepty může použít kdokoliv pro jakoukoliv aplikaci
- source-available - recepty může použít kdokoliv, ale použe pro údržbu open-source aplikací, osobních aplikací nebo interních aplikací vlastní firmy (tedy nikoliv pro komerční účely)
- komerční - poskytované v rámci různých placených služeb, společností Moderne i dalšími (např. VMWare poskytuje sadu receptů pro Spring v rámci služby Tanzu Platform)
Společnost Moderne jako své komerční řešení postavené nad OpenRewrite poskytuje platformu, která umožňuje hromadnou práci s mnoha repozitáři kódu (a tedy aplikacemi) najednou, usnadňuje správu změn napříč aplikacemi a ulehčuje vývoj vlastních receptů pomocí vizualizace stromové struktury kódu.
Pro tvorbu receptů vlastními silami pro volně dostupný OpenRewrite je dispozici jenom plugin do vývojového prostředí IntelliJ IDEA pro pomoc se syntaxí. Pro AI asistovaný vývoj receptů je tedy nutné se spoléhat na obecné programovací schopnosti běžných modelů, nebo si vytrénovat vlastní model. Právě pro tento účel je dokonce k dispozici speciální „recept“, který vygeneruje seznam všech vám dostupných receptů s jejich zdrojovými kódy pro trénování AI modelů. To už je ale, vzhledem k náročnosti, vhodné spíš pro specialisty tvořící větší množství receptů než pro občasné úpravy kódu.
Díky za Vaší pozornost a čas a doufám, že Vám tento stručný přehled přinesl nový pohled na možnosti automatizované údržby aplikací.