簡體   English   中英

如何在Java應用程序中查找正在使用的庫的數量?

[英]How to find how much of a library is being used inside a Java application?

我正在使用一個使用34個外部jar的現有Java應用程序。

我的部分工作是使代碼更清晰,更少臃腫。 通過從路徑中刪除它並測試代碼,我可以很容易地找到根本沒有使用的庫。

但是,我懷疑有一些庫只使用了一小部分(可能是一個函數或兩個函數)。

例如,有一個用於構建UI的庫。 但是,我懷疑在應用程序代碼中,它僅用於其一個/兩個日志記錄功能。 我實際上可以實現我自己的該函數版本,並完全設置應用程序的庫。

由於我無法手動瀏覽代碼,是否有任何現有工具可用於查看應用程序代碼中使用了多少代碼庫?

我傾向於使用像proguard這樣的東西來識別舊的未使用的代碼,雖然它有很多其他功能,但它們與你的問題無關。

JDepend可以告訴你應用程序類的直接依賴關系,但是這並不能真正告訴你哪些JAR可以消除,至少有兩個原因:

  1. 它只能獲取編譯類引用。 如果您使用像Spring這樣的工具,它允許您在非代碼配置文件中指定類,JDepend(或任何其他工具)無法識別它們。 如果您使用Class.forName手動加載類,則同上。
  2. 您的代碼可能不直接引用類,但您加載的內容可能(Maven將其稱為傳遞依賴項)。 例如,Hibernate需要CGLib或Javassist(或者至少它曾經用過)。 如果您依賴於Hibernate,則隱式依賴於其中一個JAR。

從JDepend開始可能最簡單,並且僅使用它告訴您需要的JAR進行構建。 然后,在運行時期間,您將獲得類未找到的異常,這些異常將告訴您需要哪些額外的JAR。

編輯:

由於我無法手動瀏覽代碼,是否有任何現有工具可用於查看應用程序代碼中使用了多少代碼庫?

作為重讀您的問題,我意識到您要求的目標比簡單的依賴性分析更具針對性。 我認為代碼覆蓋工具可能會指向正確的方向。 一些開源的可能性:

您可以檢測整個應用程序,然后正常運行並找出實際調用的類。 但是 ,您需要完全鍛煉它。 Java根據需要加載類,因此您的應用程序可能僅依賴於某些類的某些功能。

您可以在代碼和xml中搜索JAR開頭的包。

我會嘗試從構建中刪除它並重新構建程序,當它編譯測試時。

對於快速而骯臟的策略,您可以選擇編寫腳本來遞歸所有應用程序代碼並提取所有導入,將它們排序為最少使用,將基本導入包結構與jar匹配,然后檢查使用最少導入的jar的位置。

為了更好的長期分析,請先嘗試並解決這些問題。 首先,如果可以,最好轉換應用程序使用標准構建工具,例如maven。 接下來讓應用程序工作並構建在標准IDE(例如eclipse)上。

現在,您可以搜索並使用可以使您執行所需操作的插件。

例如maven

mvn依賴:分析

並看看可以做同樣的eclipse插件

例如

http://classpathhelper.sourceforge.net/

未來可維護性

這可能是預先的額外工作,但您可以更快地分析代碼,從而使您的任務更快。 如果你想成為一名大師,你甚至可以編寫一個eclipse插件並分享它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM