需求
由于項(xiàng)目需要,需要添加對JAVA源碼分析的支持。源碼分析由團(tuán)隊(duì)自己開發(fā)衡楞,但如何保障開發(fā)的分析器結(jié)果的正確性,是本項(xiàng)目任務(wù)的最大困難敦姻。
方案構(gòu)想
通過一個(gè)相對完善的JVAV分析器寺酪,生成中間輸出,基于此輸出信息與我們開發(fā)的分析器進(jìn)行比較替劈。兩者在輸出上有可能存在較大區(qū)別,如何在存在區(qū)別的文件上計(jì)算相似度得滤,將是另一個(gè)問題陨献,本文也就不去描述相似度計(jì)算這個(gè)問題。
目前JAVA分析庫或工具有不少懂更,有一些Python包可用眨业,也有通用解析器可用急膀,例如Antlr。但就Java解析來說龄捡,JavaParser是好評度最高的卓嫂,相比Python的Java解析包也更加復(fù)雜一些。本文主要記錄我(Java小白)的JavaParser實(shí)踐使用過程聘殖。
第一條記錄
時(shí)間: 2021.04.17 9:44am
地點(diǎn): 家中
預(yù)期任務(wù): 構(gòu)建Java開發(fā)環(huán)境晨雳,完成基于JavaParser庫的語法樹解析程序。
實(shí)現(xiàn)構(gòu)想:
- 安裝Ubuntu虛擬機(jī)奸腺,選擇Ubuntu主要是覺得這個(gè)環(huán)境下會更方便餐禁;
- 安裝Java開發(fā)環(huán)境;
- 了解學(xué)習(xí)Maven的使用突照,搭建相關(guān)環(huán)境帮非;
- 安裝IDE環(huán)境;
- 按官方教程讹蘑,構(gòu)建示例末盔;
- 完成語法樹解析生成程序,輸入為java源碼文件座慰,輸出為該文件對應(yīng)的語法樹描述陨舱;
安裝Ubuntu虛擬機(jī)
安裝Ubuntu版本 20.04.
安裝Java開發(fā)環(huán)境
JDK是Java開發(fā)的基礎(chǔ),需要搜索Ubuntu環(huán)境下JDK的安裝方式角骤。
sudo apt install default-jdk
默認(rèn)JDK為11.0版本隅忿,當(dāng)前maven要求版本是1.7版本,所以版本可以匹配邦尊。安裝成功后背桐,通過命令java --version進(jìn)行檢查。
注意:需要構(gòu)建一個(gè)JAVA_HOME的環(huán)境變量蝉揍,這個(gè)在JDK安裝過程中并沒有自動(dòng)構(gòu)建链峭。我指定的目錄為/usr/lib/default-java,不同系統(tǒng)下可能會不同又沾。
學(xué)習(xí)Maven
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
簡單來說弊仪,Maven是一個(gè)基于POM概念的項(xiàng)目管理工具,將項(xiàng)目涉及的多個(gè)方面都添加到一個(gè)文件中描述杖刷。例如以前項(xiàng)目描述中励饵,并沒有如何來生成對應(yīng)文檔的信息,隨著技術(shù)進(jìn)步滑燃,管理變化役听,后來出現(xiàn)了生成文檔的需要,如果分為多個(gè)工具來描述(不同工具的項(xiàng)目配置文件),對于項(xiàng)目管理來說是一個(gè)災(zāi)難典予。針對這樣的場景甜滨,就可以基于Maven進(jìn)行插件擴(kuò)展,添加對應(yīng)的項(xiàng)目信息描述瘤袖,使用者還是只維護(hù)一個(gè)項(xiàng)目文件信息衣摩。
POM,我們可以簡單理解就是一個(gè)XML文件捂敌。只是更加具體的規(guī)定了XML節(jié)點(diǎn)的名稱艾扮、屬性等信息。
對于Maven的學(xué)習(xí)黍匾,可以參考官方網(wǎng)站的介紹栏渺,包含了下載、安裝锐涯、運(yùn)行磕诊、配置等過程。對于最簡單例子來說纹腌,只需要10分鐘就可以走一遍霎终。
安裝IDE環(huán)境
Java有幾個(gè)可選的IDE環(huán)境,在安裝具體的IDE環(huán)境之前升薯,我建議直接通過原始的命令行與文本編輯器進(jìn)行示例學(xué)習(xí)莱褒,通過這種原始的方法,可以更好的理解Maven的使用過程涎劈,更好的理解IDE配置項(xiàng)的含義广凸。
為了簡單化,可以直接安裝一個(gè)專門的JAVA開發(fā)IDE蛛枚,例如IntelliJ IDEA谅海,直接使用VS Code可能在代碼提示方面會需要一些配置,需要額外的學(xué)習(xí)時(shí)間蹦浦。
構(gòu)建示例
根據(jù)Maven的教程扭吁,構(gòu)建了第一個(gè)基于Maven的項(xiàng)目。在學(xué)習(xí)了解JavaParser項(xiàng)目時(shí)盲镶,發(fā)現(xiàn)文檔中都是很簡單的示例說明侥袜,對于小白來說,還需要更多細(xì)節(jié)信息溉贿。例如枫吧,例子中,沒有導(dǎo)入包宇色,直接使用相關(guān)的類由蘑,而對于不熟悉的人來說闽寡,這些包在哪里,如何定位尼酿,都是需要熟悉的。
后來植影,在JavaParser項(xiàng)目的github倉庫中裳擎,看到有更具體的例子代碼給出,參照該例子代碼進(jìn)行POM的編寫思币,以及Java代碼的實(shí)現(xiàn)鹿响。
完成語法樹解析生成程序
JavaParser提供了初級的AST樹生成程序,支持Yaml與XML谷饿,以及其他形式的輸出惶我,在本任務(wù)中,直接使用了XML的輸出方式博投。后期绸贡,根據(jù)相似度對比的需要,再對輸出信息進(jìn)行更完整的定制毅哗。
相關(guān)代碼
https://gitee.com/imlaji/java-ast
記錄回顧
時(shí)間: 除去吃飯時(shí)間听怕,總共花費(fèi)5小時(shí)。
地點(diǎn): 家中
任務(wù)完成情況: 實(shí)現(xiàn)了基本的Java語法樹解析虑绵。
反思:
- 需要進(jìn)一步對Maven的使用進(jìn)行深入了解尿瞭,在使用過程中,只是參照例子選擇了合適的插件翅睛,有哪些插件声搁?如何選擇?都需要進(jìn)一步了解捕发;
- VS Code的代碼提示如何設(shè)置疏旨?針對不同語言有不同的擴(kuò)展,如何學(xué)習(xí)VS Code擴(kuò)展的設(shè)置方法爬骤;
- 在不熟悉充石,不了解的事情上,時(shí)間還是會可能超出預(yù)期霞玄,發(fā)生不可控的問題骤铃。