Nicky's Blog

如何快速查看Java模块依赖关系

近段我们都在研究各种架构业务蓝图,经常需要查看模块的一些依赖关系,每次手工去检查,还是挺麻烦的
尤其需要校验我们重构解耦后的成功情况,还是需要一个个打开代码检查import,god!

今天同事突然发了这个工具:

类依赖分析工具:jdeps

Jdeps是一个功能强大的命令行工具,它可以帮我们显示出包层级或者类层级java类文件的依赖关系。它接受class文件、目录、jar文件作为输入,默认情况下,jdeps会输出到控制台.

使用方法

因为这个是java V1.8自带的cmd,确保安装好java,配置完环境变量,则直接在cmd里面运行这个命令即可:

  1. 先编译好工程,使其产生class文件,进入到项目工程目标class目录,记得不是源码目录,比如我想看A目录下的依赖关系
    则cd到这个目录
  2. 执行

    1
    jdeps .
  3. 执行完,可能会有很多系统的库依赖,比如java、android库的,你可以过滤你自己包名的

    1
    jdeps . | grep yourpackagename

ps:yourpackagename 你想要过滤的关键词

  1. 如果你想更具体的信息,则可加上一些参数,比如 -V
    1
    jdeps -v . | grep yourpackagename

另外貌似这个官方提供了一个eclipse插件 叫java depends之类的,有兴趣的可以试试~


更多参数用法,大家慢慢琢磨
官方用法link

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
jdeps -help
用法: jdeps <options> <classes...>
其中 <classes> 可以是 .class 文件, 目录, JAR 文件的路径名,
也可以是全限定类名。可能的选项包括:
-dotoutput <dir> DOT 文件输出的目标目录
-s -summary 仅输出被依赖对象概要
-v -verbose 输出所有类级别被依赖对象
等同于 -verbose:class -filter:none。
-verbose:package 默认情况下输出程序包级别被依赖对象,
不包括同一程序包中的被依赖对象
-verbose:class 默认情况下输出类级别被依赖对象,
不包括同一程序包中的被依赖对象
-cp <path> -classpath <path> 指定查找类文件的位置
-p <pkgname> -package <pkgname> 查找与给定程序包名称匹配的被依赖对象
(可多次指定)
-e <regex> -regex <regex> 查找与指定模式匹配的被依赖对象
(-p 和 -e 互相排斥)
-f <regex> -filter <regex> 筛选与指定模式匹配的被依赖对象
如果多次指定, 则将使用最后一个被依赖对象。
-filter:package 筛选位于同一程序包内的被依赖对象 (默认)
-filter:archive 筛选位于同一档案内的被依赖对象
-filter:none 不使用 -filter:package 和 -filter:archive 筛选
通过 -filter 选项指定的筛选仍旧适用。
-include <regex> 将分析限制为与模式匹配的类
此选项筛选要分析的类的列表。
它可以与向被依赖对象应用模式的
-p 和 -e 结合使用
-P -profile 显示配置文件或包含程序包的文件
-apionly 通过公共类 (包括字段类型, 方法参数
类型, 返回类型, 受控异常错误类型
等) 的公共和受保护成员的签名
限制对 API (即被依赖对象)
进行分析
-R -recursive 递归遍历所有被依赖对象。
-R 选项表示 -filter:none。如果指定了 -p, -e, -f
选项, 则只分析匹配的
被依赖对象。
-jdkinternals 在 JDK 内部 API 上查找类级别的被依赖对象。
默认情况下, 它分析 -classpath 上的所有类
和输入文件, 除非指定了 -include 选项。
此选项不能与 -p, -e 和 -s 选项一起使用。
警告: 在下一个发行版中可能无法访问
JDK 内部 API。
-version 版本信息