为了账号安全,请及时绑定邮箱和手机立即绑定

LanguageTool Java API 是否有“无用”的依赖项?

LanguageTool Java API 是否有“无用”的依赖项?

至尊宝的传说 2023-10-13 16:49:24
我想使用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.jarA

但是:在运行时可能有多种方式需要 jar,但很难检测到。这包括不同类型的依赖项注入,尤其是在应用程序服务器上。


查看完整回答
反对 回复 2023-10-13
  • 1 回答
  • 0 关注
  • 47 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信