【问题标题】:Lightweight way to use a Maven dependency?使用 Maven 依赖项的轻量级方法?
【发布时间】:2021-01-17 03:20:43
【问题描述】:

当您想使用某个 Java 库中的某个实用程序时,您通常会怎么做?我的意思是,如果您将其添加为 Maven 依赖项,整个库是否会包含在组装的 JAR 中?

我没有任何类型的存储问题,我不介意 JAR 变得臃肿,但我只是好奇在这种情况下是否有一些策略可以减少 JAR 的大小。

谢谢

【问题讨论】:

  • 默认情况下,包含您的代码的 jar 和依赖项的 jar 文件是完全独立的。您可以将它们捆绑在一个“胖罐”中(也可以使用其他一些名称),但这是一个单独的步骤,而不是通常的步骤。是的,这通常意味着您“携带”整个库,即使您不使用它。
  • 默认情况下,依赖项不是 JAR 的一部分,但您可以对其进行配置。如果您声明一个依赖项,您将下载它以及所有非可选的临时依赖项。
  • 在我看来,Maven 和大多数其他自动化依赖管理系统都基于我们拥有无限存储这一事实。除了收回对依赖项的控制之外,我真的没有看到解决这个问题的方法。毕竟,我们过去管理过。
  • 类无论如何都是延迟加载的,所以尽管你携带整个jar,你可能加载少得多。

标签: java maven jar dependencies


【解决方案1】:

更糟糕的是:您不仅将“整个库”添加到您的项目中,还添加了它的依赖项,无论您是否需要它们。

Joachim Sauer 说得对,除非您希望它可运行,否则不要将依赖项捆绑到您的工件中。但恕我直言,这只是将问题转移到不同的点。最终,你想要运行这些东西。在某个时候,构建了一个可运行的 JAR、一个 WAR 或一个 EAR,它将包含整个依赖关系树(减去每个工件只能获得一个版本的事实)。

Maven shade 插件可以帮助您通过仅添加“必要”类来最小化您的 jar(请参阅Minimize an Uber Jar correctly, Using Shade-Plugin)。但总的来说,这当然很棘手:

  • 未找到非 Java 元素引用的类。
  • 找不到反射使用的类。
  • 如果你有一些依赖注入,你只在你的代码中使用接口。所以实现可能会被踢出。

所以你的最小化Jar 通常可能太小了。

如您所见,我不知道任何通用解决方案。

什么是明智的做法?

  • 不要构建有五个用途的 JAR,而要构建小的 JAR。为避免大量不同的构建过程,请使用多模块项目。
  • 除非您真的需要它们,否则不要将库添加为依赖项。最好复制一个方法来转换字符串,而不是为此添加整个字符串库。

【讨论】:

    猜你喜欢
    • 2012-05-01
    • 2012-04-24
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 2011-01-15
    • 2013-11-17
    • 2017-05-06
    • 2017-10-03
    相关资源
    最近更新 更多