【问题标题】:Is putting external jars in the JAVA_HOME/lib/ext directory a bad thing?将外部 jar 放在 JAVA_HOME/lib/ext 目录中是一件坏事吗?
【发布时间】:2010-01-15 01:58:06
【问题描述】:

我们有一个在 JRE 环境中运行的应用程序。该应用程序使用了一些外部 jar,我们一直将它们放在 JAVA_HOME/lib/ext 文件夹中。这已经为我们工作了多年,但最近一位新程序员加入了我们的团队,并且似乎强调这是一件多么糟糕的事情。我不明白为什么,在与该开发人员进一步挖掘之前,我正在尝试做一些研究。我在这里缺少什么吗?

【问题讨论】:

  • 给他加薪,或者至少给他奖金。不在您手中,请与经理交谈。说真的。

标签: java jar


【解决方案1】:

是的 - 这是一件坏事。想一想:应用程序依赖于 JRE 和一些额外的 jar。如果更新 JRE 会怎样?然后你必须记住将文件复制到新的 JRE 中。如果您需要在新系统上设置应用程序怎么办?您必须将应用程序复制到那里,然后还要记住将外部 jar 复制到该系统上的 JRE。

如果您只是将应用程序与其所需的外部 jar 正确打包在一起,那么这两个问题都不会成为问题。如果您没有看到这一点,那么也许这根本不是问题。但是你仍然应该感谢这位新人分享他的观点。

【讨论】:

  • 这在很大程度上取决于您的个人/公司使用情况。对我来说,在更新后检查 ext 目录以将常用库从这里移动到那里是很正常的事情,例如 itext (pdf-creation) 或图表库。如果有版本冲突,你想早点知道,这两种情况都需要知道。但是,如果您在一个地方而不是多个地方进行错误修复,则库中的小更新更容易处理。如果有一个程序不能处理这样一个固定的库,你无论如何都必须单独修复它。
  • 完全同意,但现在的问题是,如果我的许多应用程序都依赖于同一个库/jar,该怎么办。我不想在每个 jar 中都放一份副本,因为如果库更新,我将不得不为我的所有应用程序更改 jar。我想把这个 jar 放在我所有的应用程序都可以访问它的地方。有这样的地方吗?还是我需要使用类路径(如果我决定移动 jar,我需要更改所有应用程序的类路径......)?
  • 另一个很大的缺点是,您放在 lib/ext 目录中的 JAR 会自动添加到所有 Java 应用程序(如果它是共享 JRE)的类路径中,这可能会干扰这些应用程序。跨度>
【解决方案2】:

除了weiji的回答(打包升级到新的JVM版本),还有其他风险。

如果您在任何应用程序中使用安全管理器,默认情况下,ext 中的库通常具有更多功能 - 它们的处理方式与系统库非常相似。在执行安全规则的意义上,您需要确保您可以信任这些类。作者是否仔细考虑了他们正确曝光的内容?如果这些类不使用访问控制来更改安全上下文,那么您无需担心这一点,但您知道它们是否这样做(例如,提供对文件的访问并使用 AccessController 的方法,它是否确保调用者是否具有正确的文件权限?)

您的所有应用程序都可以使用完全相同版本的库吗?当您需要更新该库(不仅仅是 JVM)时会发生什么?你会破坏你的任何应用程序吗?您将需要重新测试所有内容。 ext 中的库由扩展类加载器加载,由于父委托,其优先级高于普通(即 CLASSPATH)加载器,因此保证您的应用程序可以使用这些库,并且没有单个应用程序使用不同版本覆盖 ext 中的库的方法。

如果您想在您的应用程序之间共享库,为什么不提供一个单独的公共库文件夹,应用程序可以单独配置 (CLASSPATH) 以供参考。然后,如果您对一个应用程序和一个库有问题,您可以切换到不同版本的库,或者仅针对那个版本,将其放在 CLASSPATH 的较早部分(如果可行,您也必须对其进行测试,因为可能存在其他依赖项问题)。这将允许您对每个应用程序进行更多的单独控制。但是,将所有必需的库与您的应用程序捆绑在一起是最安全的,因为您可以重新测试并将库升级部署到各个应用程序。

【讨论】:

    【解决方案3】:

    此外,JEP-220 似乎在表面上弃用此行为,并以某种任意方式“可能将其替换”为其他行为。

    【讨论】:

    • - 没有屏住呼吸! -
    • 实际上,扩展机制的 Java SE 方面在 JSR 337(Java SE 8 的 JSR)的维护版本中被弃用,然后在 Java SE 9 / JDK 9 中被删除。-XX:+CheckEndorsedAndExtDirs命令行选项是检查在 JDK 8 上运行的应用程序是否依赖此功能的有用选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2012-04-16
    • 2013-05-14
    相关资源
    最近更新 更多