我想使用LanguageTool 的 Java API進行拼寫檢查,因此我將其依賴項添加到我的pom.xml:<dependency>
<groupId>org.languagetool</groupId>
<artifactId>language-en</artifactId>
<version>4.7</version>
</dependency>由于某種原因,它下載了 40MB 的jar依賴項,這看起來很可疑。這是所有這些的屏幕截圖:但如果我們訪問Maven 中央存儲庫,它.jar只有4.7MB。之后我注意到scala-compiler.jar大約有20MB,我試圖排除它:<exclusion> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId></exclusion>然后我運行了我的main,一切都運行良好:public static void main(String[] args) throws IOException { JLanguageTool lang = new JLanguageTool(new AmericanEnglish()); List<RuleMatch> matches = lang.check("This is a speling errorr."); for (RuleMatch match : matches) { System.out.println(match.getSuggestedReplacements()); }}所以我花了一些時間開始排除越來越多的依賴項,在其中一些依賴項中我得到了ClassNotFoundException,這很好,因為如果language-tool使用其中一些依賴項是有意義的。但是那些沒用過的呢?是否有機會使用,但我的代碼不使用其中的任何類,所以我避免得到一個ClassNotFoundException?我的問題是為什么它會下載未使用的依賴項。有沒有辦法找出其中哪些是無用的,以便我可以排除它們?
1 回答

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
讓我嘗試更籠統地回答這個問題:
Maven 通過傳遞性地遍歷依賴關系樹來構建所有依賴關系的列表,收集每個依賴關系,然后進行依賴關系中介(如果您發現一個工件的多個版本)。
這是收集依賴關系的一種粗略方法,它或多或少保證您擁有所需的一切——但通常您擁有的更多。
這是為什么?
首先,在運行時,您通常只調用已定義類的子集,因此很容易發生應用程序的某些部分(如某些依賴項)從未被觸及的情況。在許多情況下,甚至可以靜態地證明某個依賴項永遠不能通過正常的鏈調用,因為例如您只使用A
依賴項的一個類a.jar
,并且僅在與無關的事情上a.jar
依賴但需要它。b.jar
A
但是:在運行時可能有多種方式需要 jar,但很難檢測到。這包括不同類型的依賴項注入,尤其是在應用程序服務器上。
添加回答
舉報
0/150
提交
取消