Java8使用jdeps —— Java类依赖性分析器

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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值