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

我想使用LanguageTool 的 Java API进行拼写检查,因此我将其依赖项添加到我的pom.xml

<dependency>
  <groupId>org.languagetool</groupId>
  <artifactId>language-en</artifactId>
  <version>4.7</version>
  </dependency>

由于某种原因,它下载了 40MB 的jar依赖项,这看起来很可疑。这是所有这些的屏幕截图:

https://img1.sycdn.imooc.com/652904d00001030b06850480.jpg

但如果我们访问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?


我的问题是为什么它会下载未使用的依赖项。有没有办法找出其中哪些是无用的,以便我可以排除它们?


至尊宝的传说
浏览 79回答 1
1回答

墨色风雨

让我尝试更笼统地回答这个问题:Maven 通过传递性地遍历依赖关系树来构建所有依赖关系的列表,收集每个依赖关系,然后进行依赖关系中介(如果您发现一个工件的多个版本)。这是收集依赖关系的一种粗略方法,它或多或少保证您拥有所需的一切——但通常您拥有的更多。这是为什么?首先,在运行时,您通常只调用已定义类的子集,因此很容易发生应用程序的某些部分(如某些依赖项)从未被触及的情况。在许多情况下,甚至可以静态地证明某个依赖项永远不能通过正常的链调用,因为例如您只使用A依赖项的一个类a.jar,并且仅在与无关的事情上a.jar依赖但需要它。b.jarA但是:在运行时可能有多种方式需要 jar,但很难检测到。这包括不同类型的依赖项注入,尤其是在应用程序服务器上。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java