如何快速生成Java静态调用图?Java-Callgraph2完整使用指南 🚀
Java-Callgraph2是一款强大的Java静态分析工具,能够深度解析class、jar和war文件,生成精准的方法调用关系。无论是分析复杂项目架构还是排查调用链路问题,这款工具都能为开发者提供清晰的可视化结果。本文将带你从安装到高级配置,全方位掌握这个静态调用图生成神器!
📋 目录
✨ 为什么选择Java-Callgraph2?
传统调用图工具往往会遗漏接口实现、lambda表达式、线程调用等关键场景,而Java-Callgraph2通过深度静态分析技术,完美解决了这些痛点:
✅ 完整捕获调用关系:轻松识别多态、Spring Bean注入、Stream API等复杂场景的调用链路
✅ 灵活配置选项:通过表达式语言自定义分析规则,精准过滤不需要的类和方法
✅ 高效处理大型项目:支持增量分析和并行处理,轻松应对百万行代码级项目
✅ 丰富输出格式:生成多种结构化文件,便于进一步分析和可视化
项目核心功能实现位于:src/main/java/com/adrninistrator/javacg2/
📥 一键安装步骤
环境准备
- JDK 8及以上版本
- Gradle(可选,源码编译时需要)
源码安装
# 克隆仓库
git clone https://gitcode.com/gh_mirrors/ja/java-callgraph2
cd java-callgraph2
# 编译项目
./gradlew jar
编译完成后,可执行文件将生成在项目根目录下。
组件引用
在Gradle项目中直接引用:
dependencies {
implementation 'com.github.adrninistrator:java-callgraph2:最新版本号'
}
⚙️ 核心配置指南
配置文件结构
Java-Callgraph2的配置文件集中在_javacg2_config目录下,主要包括:
| 配置文件 | 作用 |
|---|---|
| config.properties | 主要开关及输出目录配置 |
| jar_dir.properties | 指定需要解析的文件路径 |
| fr_eq_conversion_method.properties | 处理get/set方法字段关联 |
详细配置说明可参考官方文档:docs/_javacg2_all_config.md
关键配置项
1. 方法调用类型解析
# 处理方法调用时是否解析被调用对象和参数可能的类型与值
parse.method.call.type.value=true
开启此选项后,工具能识别多态调用中的实际类型,如:
Super obj = new Child();
obj.method(); // 能识别出实际调用的是Child类的method()
2. 输出目录设置
# 指定生成文件的根目录
output.root.path=./callgraph-result
# 指定生成文件后缀名
output.file.ext=.md
🚀 快速上手教程
基本使用流程
- 准备待分析文件:将需要分析的class、jar或war文件放在指定目录
- 配置文件路径:编辑
_javacg2_config/jar_dir.properties,添加文件路径:./target/classes ./lib/test.jar - 执行分析:
# Linux/Mac ./shell/run.sh # Windows .\bat\run.bat - 查看结果:分析结果将输出到
output.root.path配置的目录下
自定义分析范围
通过配置_javacg2_parse_class_method_switch目录下的文件,可灵活控制分析范围。例如,创建ignore_class_in_dir.av文件:
# 忽略特定包下的类
className.contains("com.example.test")
🔍 高级功能探索
表达式语言过滤
Java-Callgraph2支持强大的表达式语言,用于精细控制分析过程。例如,在ignore_method_call.av中添加:
# 忽略所有toString()方法调用
er.methodName == "toString"
完整的表达式语法可参考:src/main/resources/_el_example/el_usage.md
Spring应用增强分析
对于Spring项目,工具能自动识别Bean注入关系,通过配置:
# 处理Spring Bean时使用实际类型
handle.callee.spring.bean.raw.actual=only_actual
可准确捕获依赖注入场景下的实际调用关系。
❓ 常见问题解决
Q: 分析速度慢怎么办?
A: 尝试开启并行处理并调整内存配置:
# 在config.properties中添加
parallel.process=true
max.heap.size=4g
Q: 如何排除第三方库的调用?
A: 在ignore_class_in_jar_war.av中添加过滤规则:
# 排除所有以com.google开头的类
className.startsWith("com.google")
Q: 生成的调用图缺失某些方法?
A: 检查是否开启了类型解析功能:
parse.method.call.type.value=true
first.parse.init.method.type=true
📚 官方资源
- 详细使用文档:docs/how_to_use.md
- 配置参数说明:docs/_javacg2_all_config.md
- 方法调用类型说明:docs/call_type.md
通过本指南,你已经掌握了Java-Callgraph2的核心使用方法。无论是日常项目分析还是复杂架构梳理,这款工具都能成为你的得力助手。立即尝试,开启高效Java调用图分析之旅吧! 💪
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



