我想使用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
提交
取消