jdeps,即“java dependencies” 的缩写,是Java8中提供的一个工具。
jdeps命令显示Java类文件的包级或类级依赖关系。输入类可以是.class文件、目录、jar文件的路径名,或者可以是完全限定的类名称,以分析所有类文件。jdeps的参数选项决定了输出的内容。默认情况下,JDEPS将依赖关系输出到系统输出(控制台)。它可以用DOT语言生成依赖关系(见 -dotoutput 参数)。
在这篇文章里,我创建了一个简单的 Maven 项目 cat-maven-simple,在这个项目里依赖了 Java 本身的一些库,另外依赖了 fastjson 这个库。我将其打包为 cat-maven-simple.jar,然后使用 JDK8提供的 jdeps 工具分析它的依赖,看看这个工具会输出什么结果。
创建一个简单的Maven项目
使用Idea新建项目 cat-maven-simple,添加依赖如下:
<!-- fastjson -->
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
完整的 pom.xml 如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>me.zebe</groupId>
<artifactId>cat-maven-simple</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- fastjson -->
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
在 me.zebe.cat.maven 包下面创建一个 CatMavenSimpleDemo 类,生成 main 方法,完整代码如下:
package me.zebe.cat.maven;
import com.alibaba.fastjson.JSONObject;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.HashMap;
import java.util.Map;
/**
* 简单Maven项目例子
*
* @author Zebe
*/
public class CatMavenSimpleDemo {
/**
* 运行入口
*
* @param args 运行参数
*/
public static void main(String[] args) {
LocalDate today = LocalDate.now();
Map<String, Object> data = new HashMap<>();
data.put("name", "Zebe");
data.put("blog", "www.zebe.me");
data.put("date", DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).format(today));
String json = JSONObject.toJSONString(data);
System.out.println(json);
}
}
在IDEA右侧 Maven Projects 面板中,找到项目,运行 Lifecycle 下面的 package 命令,将其打包,得到生成的 jar包:cat-maven-simple-1.0-SNAPSHOT.jar。
使用jdeps分析JAR包的依赖
使用命令行进入 jar 包所在的目录(我本机的路径是:P:\personal\cat\java\cat-maven-simple\target\cat-maven-simple-1.0-SNAPSHOT.jar),然后执行一下命令:
jdeps cat-maven-simple-1.0-SNAPSHOT.jar
如果提示命令未找到,请检查你的Java版本或者环境变量配置。如果你成功安装了Java8,那么在Java安装目录下的bin目录中,会有一个 jdeps.exe 文件,这个文件就是 jdeps 依赖分析工具。
如果命令成功执行,则会输出以下结果:
cat-maven-simple-1.0-SNAPSHOT.jar -> I:\jdk-8u152\jre\lib\rt.jar
cat-maven-simple-1.0-SNAPSHOT.jar -> 找不到
me.zebe.cat.maven (cat-maven-simple-1.0-SNAPSHOT.jar)
-> com.alibaba.fastjson 找不到
-> java.io
-> java.lang
-> java.time
-> java.time.format
-> java.time.temporal
-> java.util
在上面输出的结果,提示“找不到”的那一行,说明该库无法在当前目录直接找到。
jdeps参数
jdeps可以指定很多参数运行,这里简单列举几个参数的用法,要查看全部详细的参数例子,请查看官方文档,地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html。
-s(或-summary):仅打印依赖性摘要。
-v(或-verbose):打印所有类级别的依赖项。
-verbose:package:打印包级依赖项,不包括同一归档中的依赖项。
-verbose:class:打印类级依赖项,排除同一归档中的依赖项。
-cp(或-classpath) <路径名>:指定在何处查找类文件。
-p(或-package) <包名>:指定在何处查找类文件。
-R(或-recursive):递归遍历所有依赖项。
jdeps小结
好了,jdeps工具的演示就到这里了,有了这个工具,可以在有些情况下快速的查看一个 JAR 包(或者某个单独的Java类)中依赖了哪些 JAR 包,对于快速分析问题有帮助。
jdeps官方演示地址:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html。
本文首发于个人独立博客,文章链接:http://www.zebe.me/java-8-use-jdeps-tool