JavaParser实践记录
需求
由于项目需要,需要添加对JAVA源码分析的支持。源码分析由团队自己开发,但如何保障开发的分析器结果的正确性,是本项目任务的最大困难。
方案构想
通过一个相对完善的JVAV分析器,生成中间输出,基于此输出信息与我们开发的分析器进行比较。两者在输出上有可能存在较大区别,如何在存在区别的文件上计算相似度,将是另一个问题,本文也就不去描述相似度计算这个问题。
目前JAVA分析库或工具有不少,有一些Python包可用,也有通用解析器可用,例如Antlr。但就Java解析来说,JavaParser是好评度最高的,相比Python的Java解析包也更加复杂一些。本文主要记录我(Java小白)的JavaParser实践使用过程。
第一条记录
时间: 2021.04.17 9:44am
地点: 家中
预期任务: 构建Java开发环境,完成基于JavaParser库的语法树解析程序。
实现构想:
- 安装Ubuntu虚拟机,选择Ubuntu主要是觉得这个环境下会更方便;
- 安装Java开发环境;
- 了解学习Maven的使用,搭建相关环境;
- 安装IDE环境;
- 按官方教程,构建示例;
- 完成语法树解析生成程序,输入为java源码文件,输出为该文件对应的语法树描述;
安装Ubuntu虚拟机
安装Ubuntu版本 20.04.
安装Java开发环境
JDK是Java开发的基础,需要搜索Ubuntu环境下JDK的安装方式。
sudo apt install default-jdk
默认JDK为11.0版本,当前maven要求版本是1.7版本,所以版本可以匹配。安装成功后,通过命令java --version进行检查。
注意:需要构建一个JAVA_HOME的环境变量,这个在JDK安装过程中并没有自动构建。我指定的目录为/usr/lib/default-java,不同系统下可能会不同。
学习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是一个基于POM概念的项目管理工具,将项目涉及的多个方面都添加到一个文件中描述。例如以前项目描述中,并没有如何来生成对应文档的信息,随着技术进步,管理变化,后来出现了生成文档的需要,如果分为多个工具来描述(不同工具的项目配置文件),对于项目管理来说是一个灾难。针对这样的场景,就可以基于Maven进行插件扩展,添加对应的项目信息描述,使用者还是只维护一个项目文件信息。
POM,我们可以简单理解就是一个XML文件。只是更加具体的规定了XML节点的名称、属性等信息。
对于Maven的学习,可以参考官方网站的介绍,包含了下载、安装、运行、配置等过程。对于最简单例子来说,只需要10分钟就可以走一遍。
安装IDE环境
Java有几个可选的IDE环境,在安装具体的IDE环境之前,我建议直接通过原始的命令行与文本编辑器进行示例学习,通过这种原始的方法,可以更好的理解Maven的使用过程,更好的理解IDE配置项的含义。
为了简单化,可以直接安装一个专门的JAVA开发IDE,例如IntelliJ IDEA,直接使用VS Code可能在代码提示方面会需要一些配置,需要额外的学习时间。
构建示例
根据Maven的教程,构建了第一个基于Maven的项目。在学习了解JavaParser项目时,发现文档中都是很简单的示例说明,对于小白来说,还需要更多细节信息。例如,例子中,没有导入包,直接使用相关的类,而对于不熟悉的人来说,这些包在哪里,如何定位,都是需要熟悉的。
后来,在JavaParser项目的github仓库中,看到有更具体的例子代码给出,参照该例子代码进行POM的编写,以及Java代码的实现。
完成语法树解析生成程序
JavaParser提供了初级的AST树生成程序,支持Yaml与XML,以及其他形式的输出,在本任务中,直接使用了XML的输出方式。后期,根据相似度对比的需要,再对输出信息进行更完整的定制。
相关代码
https://gitee.com/imlaji/java-ast
记录回顾
时间: 除去吃饭时间,总共花费5小时。
地点: 家中
任务完成情况: 实现了基本的Java语法树解析。
反思:
- 需要进一步对Maven的使用进行深入了解,在使用过程中,只是参照例子选择了合适的插件,有哪些插件?如何选择?都需要进一步了解;
- VS Code的代码提示如何设置?针对不同语言有不同的扩展,如何学习VS Code扩展的设置方法;
- 在不熟悉,不了解的事情上,时间还是会可能超出预期,发生不可控的问题。