![]()
你接手過一個(gè)"祖?zhèn)?Java項(xiàng)目嗎?包結(jié)構(gòu)像蜘蛛網(wǎng),改一行代碼牽出十個(gè)bug,卻沒人能說清哪個(gè)類是真正的核心。法國(guó)開發(fā)者jtama最近開源了一個(gè)工具,用3行Maven命令就能把代碼依賴變成可交互的網(wǎng)頁地圖。
這不是靜態(tài)報(bào)告,是活的架構(gòu)圖——節(jié)點(diǎn)能拖拽、關(guān)系能過濾,甚至能一眼看出哪個(gè)包被耦合成了"交通樞紐"。
從"盲人摸象"到上帝視角
jtama在博客中寫得很直白:「Is this package too tightly coupled to others? What is the central class of my domain?」——這些問題每個(gè)維護(hù)過老代碼的人都問過。傳統(tǒng)方案是請(qǐng)架構(gòu)師畫UML圖,但圖會(huì)過期,代碼不會(huì)等你。
OpenRewrite本身就要構(gòu)建完整的LST(Lossless Semantic Trees,無損語義樹)來分析代碼,jtama的思路很簡(jiǎn)單:既然已經(jīng)遍歷了全部源碼,順手把類之間的關(guān)系記下來就行。他的Project Graph Generator就是這個(gè)"順手"的產(chǎn)物。
用法極簡(jiǎn)。在項(xiàng)目根目錄執(zhí)行:
![]()
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.recipeArtifactCoordinates=io.github.jtama:project-graph-generator:RELEASE \
-Drewrite.activeRecipes=io.github.jtama.openrewrite.ProjectAerialViewGenerator \
-Drewrite.exportDatatables=true
運(yùn)行結(jié)束后,根目錄會(huì)生成一個(gè)class-diagram.html。雙擊打開,就是一張用D3.js渲染的力導(dǎo)向圖——類是節(jié)點(diǎn),依賴是連線,顏色區(qū)分包路徑,節(jié)點(diǎn)大小反映被引用次數(shù)。
技術(shù)實(shí)現(xiàn):ScanningRecipe的"偏科"用法
OpenRewrite的Recipe通常有兩階段:scan(掃描收集信息)和visit(修改代碼)。jtama的這個(gè)工具把"偏科"玩到了極致——visit階段完全空置,所有 intelligence 集中在scan階段。
核心是一個(gè)GraphScanAccumulator,邊遍歷LST邊填充兩個(gè)列表:nodes(類節(jié)點(diǎn))和links(依賴關(guān)系)。JavaIsoVisitor負(fù)責(zé)識(shí)別類聲明、字段類型、方法參數(shù)中的引用關(guān)系,把語義關(guān)聯(lián)轉(zhuǎn)成圖數(shù)據(jù)。
生成階段直接輸出HTML,內(nèi)嵌D3.js和JSON數(shù)據(jù)。這意味著你不需要部署服務(wù)器,不需要配置數(shù)據(jù)庫,單個(gè)文件就能在瀏覽器里交互探索。jtama甚至預(yù)留了過濾參數(shù),可以按包名正則表達(dá)式裁剪節(jié)點(diǎn),避免大型項(xiàng)目的圖變成"一團(tuán)亂麻"。
![]()
這種"單文件交付"的設(shè)計(jì)很產(chǎn)品經(jīng)理思維——用戶要的是結(jié)果,不是搭建可視化平臺(tái)的周末。
為什么這工具能活下來
代碼可視化工具很多,但多數(shù)死在"過度工程"。有的要接入CI/CD流水線,有的要配置復(fù)雜的查詢語法,有的生成靜態(tài)圖片第二天就過時(shí)。jtama的方案抓住了三個(gè)痛點(diǎn):
零侵入。不改動(dòng)你的構(gòu)建流程,一條命令即插即用。
零依賴。輸出是HTML,連D3.js都打包在內(nèi),斷網(wǎng)也能看。
零延遲。基于OpenRewrite的LST,圖和代碼實(shí)時(shí)同步。
jtama在文末的邀請(qǐng)也很開源社區(qū):「Go ahead, it's open source, use it, fork it, make issues and pull requests」。項(xiàng)目托管在GitHub,目前功能聚焦Java,但ScanningRecipe的機(jī)制理論上支持任何OpenRewrite能解析的語言。
有個(gè)細(xì)節(jié)值得玩味:工具的命名從Project Graph Generator到ProjectAerialViewGenerator,jtama顯然在強(qiáng)調(diào)" aerial view(航拍視角)"這個(gè)隱喻——不是鉆到代碼里逐行看,而是升到足夠高度,看清山脈和河流的走向。
你上次看清自己項(xiàng)目的"地形",是什么時(shí)候?
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.