【问题标题】:Is it possible to reload shared libraries in WebSphere Application Server (WAS) without restarting the application?是否可以在不重新启动应用程序的情况下重新加载 WebSphere Application Server (WAS) 中的共享库?
【发布时间】:2020-04-24 15:52:43
【问题描述】:

我有一个使用共享库的 WebSphere 应用程序。每当对共享库路径中的任何 jar 进行更新时,需要重新启动使用它的应用程序以获取最新更改。是否可以让 WAS 应用程序重新加载共享库而无需重新启动?

我使用的是传统的 WAS 8.5.5.16。

【问题讨论】:

    标签: java shared-libraries websphere


    【解决方案1】:

    简短回答:不。

    长答案:您不能这样做是有技术原因的。 Java 类加载器通常不支持重新创建它们已经定义的 Class 对象——一旦定义了一个类,它就被定义了,这就是类加载器的生命周期(loadClass 的第一步是“findLoadedClass”,它搜索对于您正在加载的类的现有版本)。为了让 Java 同意加载 Class 对象的新实例,您需要创建一个全新的类加载器,并且在 Java EE(或至少是 WAS)设置中,这需要重新启动应用程序。

    根据您的问题,我相信您只是将普通共享库与您的应用程序相关联,因此这不一定适用,但我会注意到,如果您使用隔离的共享库(它有自己的类加载器) 或在服务器上配置的共享库加载器,即使重新启动应用程序也是不够的,因为这些库加载器是与服务器一起创建的,而不是与应用程序一起创建的,因此它们需要重新启动服务器才能获取更改。

    【讨论】:

    • 感谢@Jarid 的长(和短)回答。我正在尝试找到一种方法来更新此应用程序而不必将其关闭。如果可能的话,您会建议任何方法来实现这一目标吗?
    • 关于我唯一能想到的就是编写自己的类加载器,并让它处理加载可能更改的类(以及任何依赖于它们的类,否则你最终可能会得到LinkageErrors 或 ClassCastExceptions,尽管我认为无论如何都很难避免)。您需要检查新类二进制文件的东西,以及在检测到更改时重新生成类加载器的方法。
    • 感谢您的信息。
    【解决方案2】:

    没有。它们只在服务器启动时加载一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 2016-01-30
      • 2011-06-18
      • 2019-12-15
      • 2011-04-20
      • 2014-07-21
      相关资源
      最近更新 更多