从Java源码自动生成UML类图

选了一门 Java 程序设计课, 课程要求画出项目中各个类的类图. 手动画类图非常花时间, 而且大部分都是复制粘贴这种重复的工作. 本着能偷懒尽量偷懒的原则, 我开始在网上寻找能从源代码自动生成 class diagram 的工具. 一些 IDE, 例如 Eclipse 等等是可以通过插件自动生成类图的, 但是 IDE 这种工具还是太重, 我需要的是一个轻量化的简单的小工具.

环境配置

使用项目 uml-reverse-mapper 构建 UML 图. 项目的 GitHub主页 有非常详细的使用说明.

项目使用 maven 构建, 使用前需要预先配置好环境.

构建完成后会在 target 目录下得到一个名为 urm-core.jar 的文件, 取出这个文件即可.

基本使用

首先需要将项目编译并打包为 .jar 文件. 例如对具有如下文件结构的项目:

1
2
3
example
├── bar.class
└── foo.class

example 同级目录下运行:

1
jar -cf example.jar example

就可以完成打包.

将前面编译打包得到的 urm-core.jar 文件和需要分析的打包好的项目文件放在同级目录下, 运行:

1
java -cp example.jar:urm-core.jar com.iluwatar.urm.DomainMapperCli -p example -f output.pu

将会对 example 这个 package 中的类关系进行分析, 并将 UML 源码写入 output.pu 文件中.

命令中的 com.iluwatar.urm.DomainMapperCli 指定了运行时的主类, 不需要改动.

常用的一些命令如下:

  • -p: 指定要分析的 package 名称. 如果要分析多个 package, 可以用 -p "package1, package2" 的格式指定.
  • -i: 指定要忽略的类名
  • -f: 指定输出文件的文件名. 不加该选项默认输出到标准输出.

注意: 如果是 Windows 环境要使用 ; 分隔包名, 而不是 : . 例如上面的命令应该改成:

1
java -cp example.jar;urm-core.jar com.iluwatar.urm.DomainMapperCli -p example -f output.pu

版本兼容

在 JDK 17 环境中运行该工具出现报错:

1
2
3
4
5
6
7
8
9
10
Exception in thread "main" java.lang.IllegalArgumentException: Unsupported class file major version 61
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:196)
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:177)
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:163)
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:284)
at com.iluwatar.urm.scanners.FieldScanner.extractFieldEdges(FieldScanner.java:56)
at com.iluwatar.urm.scanners.FieldScanner.getEdges(FieldScanner.java:46)
at com.iluwatar.urm.DomainMapper.describeDomain(DomainMapper.java:38)
at com.iluwatar.urm.DomainMapperCli.run(DomainMapperCli.java:70)
at com.iluwatar.urm.DomainMapperCli.main(DomainMapperCli.java:27)

查资料发现这是版本不兼容导致的. 根据项目的更新日志, 目前的 2.0.0 版本刚刚加入了对 JDK 11 的支持, 因此推测是 JDK 版本太新导致的不兼容.

根据报错信息顺藤摸瓜, 发现是其中的 asm 模块里的 ClassReader 报错. 该项目使用的 asm 版本是 7.3.1, 查看 asm 的发行日志发现最早支持 JDK 17 的版本是 9.1. 因此需要对项目的 asm 版本进行升级.

打开项目的 pom.xml 文件, 找到这一行代码:

1
<asm.version>7.3.1</asm.version>

将其中的 7.3.1 修改为 9.1 即可. 当然这仅仅是最简单的修改, 不排除出现一些兼容性问题的可能.

修改之后的代码可以参考这个仓库.

类似项目

其他一些项目据称也可以生成代码的 UML 类图, 但是配置方面比较麻烦或者提供的功能过于丰富, 记录在此供参考:

  • umldoclet: 可以从源码生成整个项目的网页格式的文档, 包括 UML 图. 不过提供的功能太多, 目前确实用不上.

  • PlantUML Dependency: 可以分析项目的包依赖情况并生成 UML 图.

参考资料

Introduction to the POM