jdeps_JDeps入门–分析项目的依赖关系
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
jdeps
總結
以上是生活随笔為你收集整理的jdeps_JDeps入门–分析项目的依赖关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 节奏大师电脑网页版(节奏大师官方版)
- 下一篇: 联想p900(联想p9000k)