JDeps入门–分析项目的依赖关系

JDeps是Java依赖关系分析工具 ,这是一个命令行工具,它处理Java字节码(意味着.class文件或包含它们的JAR),并分析类之间静态声明的依赖关系。 可以用各种方式过滤结果,并可以将其汇总到包或JAR级别。 JDeps还可以告诉您您的项目使用了哪些JDK内部API,并且完全了解模块系统 。 总而言之,它是检查各种形式的依赖图的非常有用的工具。

在这篇文章中,我将向您介绍JDeps的工作方式-后续文章将向您展示一些很好的用例。 对于此探索,我鼓励您继续进行,最好是执行您的一个项目。 如果您有一个项目的JAR,并且在它旁边有一个包含所有传递依赖项的文件夹,这将是最容易的。 如果您使用的是Maven,则可以通过maven-dependency-plugin的copy-dependencies目标实现后者。 使用Gradle,您可以使用复制任务,从设置为configuration.compile或configuration.runtime 。

作为示例项目,我选择了Scaffold Hunter :

Scaffold Hunter是基于Java的开源工具,用于对数据集进行可视化分析,重点是生命科学中的数据,旨在直观地访问大型和复杂的数据集。 该工具提供多种视图,例如图形,树状图和图解视图,以及分析方法,例如用于聚类和分类

我下载了2.6.3版本的ZIP,并将所有依赖项都复制到了libs中。

当显示输出时,我将scaffoldhunter(在软件包名称中)和scaffold-hunter(在文件名称中)缩写为sh以使其更短。

认识JDeps

从Java 8开始,您就可以在JDK的bin文件夹中找到JDeps可执行文件jdeps。如果在命令行上可以找到JDeps可执行文件jdeps,则最容易使用它,为此您可能必须执行一些特定于操作系统的设置步骤。 确保jdeps –version可以正常工作并显示Java 9版本正在运行。

下一步是获取JAR并将JDeps设置为宽松。 在不使用其他命令行选项的情况下使用,它将首先列出代码所依赖的JDK模块。 紧随其后的是软件包级别的依赖关系列表,其组织为<package>-> <package> <module / JAR>。

调用jdeps sh-2.6.3.jar将产生以下输出:

$ jdeps sh-2.6.3.jarsh-2.6.3.jar -> java.base
sh-2.6.3.jar -> java.datatransfer
sh-2.6.3.jar -> java.desktop
sh-2.6.3.jar -> java.logging
sh-2.6.3.jar -> java.prefs
sh-2.6.3.jar -> java.sql
sh-2.6.3.jar -> java.xml
sh-2.6.3.jar -> not foundedu.udo.sh -> com.beust.jcommander  not foundedu.udo.sh -> edu.udo.sh.data       sh-2.6.3.jaredu.udo.sh -> edu.udo.sh.gui        sh-2.6.3.jaredu.udo.sh -> edu.udo.sh.gui.util   sh-2.6.3.jaredu.udo.sh -> edu.udo.sh.util       sh-2.6.3.jaredu.udo.sh -> java.io               java.baseedu.udo.sh -> java.lang             java.baseedu.udo.sh -> javax.swing           java.desktopedu.udo.sh -> org.slf4j             not found
[... truncated many more package dependencies ...]

您可以看到Scaffold Hunter依赖于模块java.base (当然), java.desktop (这是一个Swing应用程序), java.sql (数据集存储在SQL数据库中)以及其他一些模块。 这之后是一堆长长的软件包依赖项,这有点麻烦。请注意,有些依赖项被标记为未找到,这很有意义,因为我没有告诉JDeps在哪里寻找它们。

现在是时候使用各种选项配置JDeps了。 您可以使用jdeps -h列出它们。

包括依赖项

JDeps的一个重要方面是,它使您可以像分析代码一样将其依赖性进行分析。 该目标的第一步是使用–class-path将它们放到类路径中。

这使JDeps能够遵循进入依赖项JAR的路径,并使您摆脱未找到的指标。 要实际分析依赖关系,还需要使用-recursive或-R将JDeps递归到它们。

为了包括Scaffold Hunter的依赖关系,我使用–class-path'libs / *'和-recursive执行JDeps:

$ jdeps --class-path 'libs/*' -recursive sh-2.6.3.jar[... truncated split package warnings ...]
[... truncated some module/JAR dependencies...]
sh-2.6.3.jar -> libs/commons-codec-1.6.jar
sh-2.6.3.jar -> libs/commons-io-2.4.jar
sh-2.6.3.jar -> libs/dom4j-1.6.1.jar
sh-2.6.3.jar -> libs/exp4j-0.1.38.jar
sh-2.6.3.jar -> libs/guava-18.0.jar
sh-2.6.3.jar -> libs/heaps-2.0.jar
sh-2.6.3.jar -> libs/hibernate-core-4.3.6.Final.jar
sh-2.6.3.jar -> java.base
sh-2.6.3.jar -> java.datatransfer
sh-2.6.3.jar -> java.desktop
sh-2.6.3.jar -> java.logging
sh-2.6.3.jar -> java.prefs
sh-2.6.3.jar -> java.sql
sh-2.6.3.jar -> java.xml
sh-2.6.3.jar -> libs/javassist-3.18.1-GA.jar
sh-2.6.3.jar -> libs/jcommander-1.35.jar
[... truncated more module/JAR dependencies...]edu.udo.sh -> com.beust.jcommander  jcommander-1.35.jaredu.udo.sh -> edu.udo.sh.data       sh-2.6.3.jaredu.udo.sh -> edu.udo.sh.gui        sh-2.6.3.jaredu.udo.sh -> edu.udo.sh.gui.util   sh-2.6.3.jaredu.udo.sh -> edu.udo.sh.util       sh-2.6.3.jaredu.udo.sh -> java.io               java.baseedu.udo.sh -> java.lang             java.baseedu.udo.sh -> javax.swing           java.desktopedu.udo.sh -> org.slf4j             slf4j-api-1.7.5.jar
[... truncated many, many more package dependencies ...]

在这种特定情况下,输出以一些拆分程序包警告开头,我现在将忽略它们。 以下模块/ JAR和程序包的依赖关系与以前类似,但是现在都可以找到,因此它们的数量更多。 但是,这会使输出变得更加压倒一切,因此现在该是时候来研究如何从如此大量的数据中弄清楚了。

配置JDeps的输出

有多种方法可以配置JDeps的输出。 也许在任何项目的首次分析中使用的最佳选择是-summary或​​-s,它们仅显示JAR之间的依赖关系,而忽略包的依赖关系。 下表列出了各种其他方式来获取有关依赖关系的不同观点:

选项 描述
–package或-p 其次是只考虑该包,这是看哪里使用这些utils的所有地方一个伟大的方式依赖包名。
–regex或-e 后跟一个正则表达式,它仅考虑与正则表达式匹配的类的依赖。
(请注意,除非使用-verbose:class,否则输出仍会显示包。)
-filter或-f 后跟一个正则表达式,它排除对与正则表达式匹配的类的依赖。
(请注意,除非使用-verbose:class,否则输出仍会显示包。)
-filter:存档 在许多情况下,工件的依赖性不是那么有趣。
此选项将忽略它们,仅显示工件的依赖性。
–仅API 有时,尤其是在分析库时,您只关心JAR API。
使用此选项,仅检查公共签名和公共类的受保护成员的签名中提到的类型。

命令行上的输出是检查细节并深入研究有趣的位的好方法。 但是,它并不能提供最直观的概述-图表要好得多。 幸运的是,JDeps具有–dot-output选项,该选项可为每个单独的分析创建.dot文件 。 这些文件是纯文本,但是可以使用其他工具(例如Graphviz)从它们创建图像。

这两个命令产生下图:

$ jdeps --class-path 'libs/*' -recursive --dot-output dots sh-2.6.3.jar
$ dot -Tpng -O dots/summary.dot

深钻

如果您想了解更多细节,-verbose:class将列出类之间的依赖关系,而不是将它们聚合到包级别。

有时,仅列出对程序包或类的直接依赖是不够的,因为它们可能实际上不在代码中,而在依赖中。 在这种情况下,-inverse或-I可能会有所帮助。 给定要查找的特定程序包或正则表达式,它会一直跟踪依赖关系,并在此过程中列出工件。 不幸的是,似乎没有直接方法可以在类级别而不是工件上查看结果。

在您的特定情况下,还有其他一些选项可能会对您有所帮助–如前所述,您可以使用jdeps -h列出它们。

JDeps和模块

就像由于模块系统 ,编译器和JVM可以在更高的抽象级别上运行一样 ,JDeps也可以。 可以使用–module-path指定模块路径(请注意-p已经保留,因此它不是此选项的简写),而初始模块可以使用–module或-m指定。 从那里,我们上面所做的分析可以完全相同。

因为Scaffold Hunter尚未模块化,所以我将切换到我在书中使用的有关Java 9模块系统的示例项目Monitor应用程序 。 在这里,我正在创建模块关系的摘要分析:

# on `master` branch
$ jdeps --module-path mods:libs -m monitor -summary -recursive[... truncated some module dependencies...]
monitor -> java.base
monitor -> monitor.observer
monitor -> monitor.observer.alpha
monitor -> monitor.observer.beta
monitor -> monitor.persistence
monitor -> monitor.rest
monitor -> monitor.statistics
monitor.observer -> java.base
monitor.observer.alpha -> java.base
monitor.observer.alpha -> monitor.observer
monitor.observer.beta -> java.base
monitor.observer.beta -> monitor.observer
monitor.persistence -> java.base
monitor.persistence -> monitor.statistics
monitor.rest -> java.base
monitor.rest -> monitor.statistics
monitor.rest -> spark.core
monitor.statistics -> java.base
monitor.statistics -> monitor.observer
slf4j.api -> java.base
slf4j.api -> not found
spark.core -> JDK removed internal API
spark.core -> java.base
spark.core -> javax.servlet.api
spark.core -> jetty.server
spark.core -> jetty.servlet
spark.core -> jetty.util
spark.core -> slf4j.api
spark.core -> websocket.api
spark.core -> websocket.server
spark.core -> websocket.servlet
[... truncated more module dependencies...]

除此之外,还有一些Java 9和特定于模块的选项。 使用–require <modules>,您可以列出所有需要命名模块的模块。 您可以使用–jdk-internals分析项目的有问题的依赖关系,以及–generate-module-info或–generate-open-module创建模块描述符的初稿。 正如前面提到的,JDeps还将始终报告其找到的所有拆分包。

在以后的文章中,我将向您展示如何使用这些标志来帮助您的项目进行模块化。

获取我的书,并了解有关如何在Java 9迁移中使用JDeps的更多信息!
Java 9模块系统

  • 模块系统的深入介绍:
    • 基本概念和高级主题
  • 曼宁(Manning)发布:
    • 自2017年赛事开始提供抢先体验
  • 订阅我的时事通讯以保持关注。
    (甚至可以偷看。)

使用代码fccparlog可获得 37%的折扣

反射

使用JDeps,您可以分析项目的静态声明的依赖关系。 它在类级别上运行,但是将结果汇总到包和工件级别。 使用各种过滤器,您可以专注于最重要的方面。 也许最基本的分析是跨代码和第三方库的工件依赖关系图:

$ jdeps --class-path 'libs/*' -summary -recursive sh-2.6.3.jar

它可用于执行一些非常有趣的分析,尤其是在较大的代码库上。 我将很快向您展示一些示例。

翻译自: https://www.javacodegeeks.com/2017/07/jdeps-primer-analyzing-projects-dependencies.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

禅道开源版用户手册_Docker搭建开源版禅道以及项目基本流程介绍

对于自学软件测试的同学来说&#xff0c;经常会遇到这样的困惑&#xff1a;测试用例怎么写&#xff1f;有啥好的模板&#xff1f;缺陷提交的模板是什么样的&#xff1f;bug的生命周期是啥&#xff1f;项目的流程是啥&#xff1f;以上这些困惑&#xff0c;在你仔细看完这篇文章后…

f12 卡 谷歌浏览器_抢券第二课:利用浏览器F12获取优惠券请求链接

抢券第二课为什么迟迟不来呢&#xff1f;因为最近京东没有那种神券需要定点抢购的&#xff0c;我也没法测试我的理论。现在京东的券随时可以领取到&#xff0c;我多没法测试的东西不想就这样欺骗你们。所以今天的第二课我们讲一讲神奇的谷歌浏览器F1201 工具准备一、浏览器这里…

Java命令行界面(第5部分):JewelCli

细算在Java命令行处理与Apache的百科全书CLI &#xff0c; args4j &#xff0c; jbock和命令行中先前的文章&#xff0c;我把注意力转向在这个岗位使用JewelCli完成的命令行参数相似的处理Java中。 几个Java命令行处理库使用批注来定义命令行选项。 到目前为止&#xff0c;本系…

dnf用虚拟机会被制裁吗_DNF: 神豪奶妈扬言, 战斗力没有超过他的, 都不配被加buff!...

要说到现在的年轻人们的交友方式绝对少不了游戏交友&#xff0c;以前的人们只要不出门那就是与世隔绝&#xff0c;而现在就算是不出门也可以在网络上结交一大帮朋友&#xff0c;游戏就是现在的年轻人们交友最多的地方之一。科技的发展让游戏进入了一个繁荣的春天&#xff0c;不…

什么叫轻量瓷_为什么说陶瓷是华夏文明的徽章?

一、先说何为徽章&#xff1f;徽&#xff0c;最基本的解释是标志、符号&#xff1b;章&#xff0c;基本释义较多&#xff0c;其之一为佩戴在身上的标志&#xff0c;如领章、胸章等。徽章&#xff0c;也就是佩戴在身上用以表示身份、职业或者荣誉的标志。徽章的作用是明确身份、…

Java命令行界面(第10部分):picocli

picocli主页面将picocli描述为“强大的微小命令行界面”&#xff0c;“ picocli”是一个文件Java框架&#xff0c;用于解析命令行参数并生成精美&#xff0c;易于定制的用法帮助消息。 有颜色。” 这篇文章简要介绍了如何使用Picocli 0.9.7处理Java代码中的命令行参数。 像本系…

workunit 的指的工作单元是什么_分频器是做什么用的?

由于现在的音箱几乎都采用多单元分频段重放的设计方式&#xff0c;所以必须有一种装置&#xff0c;能够将功放送来的全频带音乐信号按需要划分为高音、低音输出或者高音、中音、低音输出&#xff0c;才能跟相应的喇叭单元连接&#xff0c;分频器就是这样的装置。如果把全频带信…

合并不同gdb下的相同要素_GDB调试学习

简介GDB是GCC的调试工具。其功能如下&#xff1a;启动程序&#xff0c;使程序按自定义形式运行&#xff1b;使程序停止指定断点位置&#xff1b;程序停止后&#xff0c;检查程序执行中的相应情况&#xff1b;动态改变程序执行环境。gdb调试能进行GDB调试&#xff0c;一般在编译…

endnote文献顺序编号不对_把Endnote装进大脑:行走的文献管理者

是否还迷失在茫茫的文献海洋&#xff0c;东翻西找&#xff0c;仍无法获得需要的文献信息&#xff1f;是否还在半手动导入参考文献&#xff0c;费时费力&#xff1f;别着急&#xff0c;文献管理神器-Endnote轻松帮你搞定这些问题。把Endnote“装进”大脑&#xff0c;你就能成为行…

蔡司三坐标_蔡司三坐标测针的安装指南

1、装配和辅助工具合适的辅助工具可以在组装测针组时有效防止各部件的损坏&#xff0c;确保安装的安全进行。下面是几种最重要的装配和辅助工具。2、正确调整MT/VAST吸盘MT/VAST吸盘可以通过顶部的三个螺丝进行旋转调节。必须使用不超过2Nm的扭力紧固&#xff0c;为了防止螺丝的…

三电平igbt死区时间计算_IGBT基础与运用-2

IGBT基础与运用-1尝试去计算IGBT的开启过程&#xff0c;主要是时间和门电阻的散热情况。C.GE 栅极-发射极电容C.CE 集电极-发射极电容C.GC 门级-集电极电容(米勒电容)Cies CGE CGC 输入电容Cres CGC 反向电容Coes CGC CCE 输出电容根据充电的详细过程&#xff0c;可以下图…

在2017年从Maven工件生成P2存储库

几年前&#xff0c;我写了一篇博客文章&#xff0c;介绍如何基于Maven工件生成P2存储库。 如今&#xff0c;这种描述的方法已经过时了&#xff0c;我想展示一种基于p2-maven-plugin的新方法&#xff0c;该方法是为解决该问题而创建的。 Maven构建生命周期中的P2-Maven-Plugin集…

循环次数几次_圆柱模板循环使用次数是多少呢

对于同一处做同样的工程&#xff0c;如果需要使用的是圆柱模板&#xff0c;用户一定考虑到底该进多少货&#xff0c;备多少料(圆柱模板)呢&#xff1f;这就需要考虑到圆柱模板循环使用次数和错开的程度来进行决定的&#xff1f;建筑圆柱模板能周转几次&#xff1f;这可能是所有…

network 拦截不到东西是怎么做到的?_都说读中职院校学不到东西,中职学生到底是怎么学习的?...

中职院校在社会中的影响一直并不是很好&#xff0c;一直都是负面影响高于正面影响&#xff0c;那么&#xff0c;我们不禁就要问了&#xff0c;一直在喊提升中职院校的教学质量&#xff0c;质量提升到哪里去了呢&#xff01;那些中职院校里的学生到底又是怎么学习的呢&#xff1…

数组中查找並返回数组_java数组查找常见情况

一.最简单的查找元素方法&#xff08;依次比较&#xff09;&#xff1a;给一个数组&#xff0c;在数组里面查找某个元素在数组中的位置&#xff0c;并返回它的位置。public static void main(String[] args) {int arr[] new int[]{12, 4, 54, 57, 87, 3, 41, 1, 3, 4, 1, 3, 4…

阿帕奇跨域_阿帕奇骆驼遇见Redis

阿帕奇跨域键值商店的兰博基尼 Camel是最好的面包集成框架&#xff0c;在本文中&#xff0c;我将向您展示如何通过利用另一个出色的项目Redis使它更加强大。 Camel 2.11即将发布&#xff0c;具有许多新功能&#xff0c;错误修复和组件。 这些新组件中的几个是我创作的&#…

误码率越高越好还是越低越好_ISO永远都是越低越好?不一定!这些情况下要用高 ISO!...

关于摄影中的参数&#xff0c;在说到 ISO(感光度)的时候&#xff0c;大家脑海中肯定都会想到那句摄影中的定律——“使用尽可能低的 ISO ”&#xff0c;这是为什么呢&#xff1f;通过下面这张典型的高 ISO 照片我们能知道原因在图片里&#xff0c;那些不自然的、充斥整个画面的…

如何在Java 8中创建线程安全的ConcurrentHashSet?

在JDK 8之前&#xff0c;还没有办法在Java中创建大型的线程安全的ConcurrentHashSet。 java.util.concurrent包甚至没有一个名为ConcurrentHashSet的类&#xff0c;但是从JDK 8开始&#xff0c;您可以使用新添加的keySet&#xff08;默认值&#xff09;和newKeySet&#xff08;…

删除 多个表_合并汇总多个工作簿多个工作表,删除修改新增更新内容只需刷新...

要求&#xff1a;1、把多个工作簿的多个工作表内容合并汇总2、后续在任一工作表内删除修改新增内容&#xff0c;无需再重新做表3、后续在任一工作簿中新增一个或多个工作表&#xff0c;无需再重新做表4、后续在文件夹中添加一个或多个Excel工作簿文件&#xff0c;无需再重新做表…

OAuth2,JWT,Open-ID Connect和其他令人困惑的事物

免责声明 如果觉得我必须从一个重要的免责声明开始这篇文章&#xff1a; 不要太相信我要说的话。 我之所以这样说&#xff0c;是因为我们正在讨论安全性。 而且&#xff0c; 当您谈论安全性时&#xff0c;除了100&#xff05;正确的陈述外&#xff0c;还有冒任何其他风险的风险…