将外部jar放在JAVA_HOME/lib/ext目录中是件坏事吗?

将外部jar放在JAVA_HOME/lib/ext目录中是件坏事吗?,java,jar,Java,Jar,我们有一个在JRE环境中运行的应用程序。该应用程序使用一些外部jar,我们一直将它们放在JAVA_HOME/lib/ext文件夹中。这已经为我们工作了很多年,但最近一个新的程序员加入了我们的团队,似乎强调这是一件多么糟糕的事情。我不明白为什么,我正在尝试做一些研究之前,我进一步挖掘这个开发人员。这里有我遗漏的东西吗 是的,这是件坏事。想想看:应用程序依赖于JRE和一些额外的JAR。如果你更新了JRE呢?然后,您必须记住将文件复制到新的JRE中。如果需要在新系统上设置应用程序,该怎么办?您必须在那

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

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


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

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

如果您在任何应用程序中使用security manager,ext中的库在默认情况下通常具有更大的功能—它们被视为与系统库非常相似。您需要确保在强制执行安全规则的意义上,您可以信任这些类。作者是否正确地思考了他们所揭露的内容?如果这些类不使用访问控制来更改安全上下文,那么您不必担心这一点,但您知道它们是否使用了访问控制(例如,提供文件访问权限并使用AccessController的方法,是否确保调用方具有正确的文件权限?)

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


如果希望在应用程序之间共享库,为什么不提供一个单独的公共库文件夹,应用程序可以单独配置(类路径)以引用这些库呢。然后,如果一个应用程序和库出现问题,可以切换到库的其他版本,或者只切换到该版本,将其放在类路径的前面(如果这样做有效,您还必须测试它,因为可能存在其他依赖性问题)。这将允许您对每个应用程序进行更多的单独控制。但是,将所有必需的库与应用程序捆绑在一起是最安全的,因为您可以重新测试并向单个应用程序推出库升级。

此外,它表面上似乎是在用一些武断的手段“可能替换”这种行为,以其他行为来“取代它”。

给他加薪,或者至少给他奖金。不在你的手中,和经理谈谈。说真的,这在很大程度上取决于你的个人/公司用途。对我来说,在更新后检查ext目录是一件正常的事情,可以将常用的库从这里移到那里,例如itext(pdf创建)或图表库。如果存在版本冲突,您希望尽早知道,并且在这两种情况下都需要知道。但是,如果在一个位置而不是在多个位置进行修复,那么修复库中的小更新更容易处理。如果有一个程序不能处理这样一个固定的库,你无论如何都必须单独修复它。完全同意,但现在的问题是,如果我的许多应用程序依赖于同一个库/jar,该怎么办。我不想在每个应用程序中都放一个jar副本,因为如果库更新,我就必须为我的所有应用程序更改jar。我想把这个罐子放在一个所有应用程序都可以访问的地方。有这样的地方吗?或者我需要使用类路径(如果我决定移动jar,就会出现问题,我需要为我的所有应用程序更改类路径…)?另一个大缺点是,您放在lib/ext目录中的jar会自动添加到所有Java应用程序的类路径中(如果是共享JRE),这可能会干扰那些应用程序-我不能屏住呼吸-实际上,扩展机制的JavaSE方面在JSR337(JavaSE8的JSR)的维护版本中被弃用,然后在JavaSE9/JDK9中被删除。
-XX:+CheckEndorsedAndExtDirs
命令行选项是一个有用的选项,用于检查在JDK 8上运行的应用程序是否依赖于此功能。