Java 是否可以在不重新启动应用程序的情况下重新加载WebSphereApplicationServer(WAS)中的共享库?

Java 是否可以在不重新启动应用程序的情况下重新加载WebSphereApplicationServer(WAS)中的共享库?,java,shared-libraries,websphere,Java,Shared Libraries,Websphere,我有一个利用共享库的WebSphere应用程序。每当对共享库路径中的任何jar进行更新时,都需要重新启动使用它的应用程序以获得最新的更改。是否可以让WAS应用程序在不重新启动的情况下重新加载共享库 我使用的是传统WAS 8.5.5.16。简短回答:否 详细回答:你不能这么做是有技术原因的。Java类加载器通常不支持重新创建它们已经定义的类对象——一旦定义了一个类,它就被定义了,这就是类加载器的生命周期(loadClass中的第一步是“findLoadedClass”,它搜索正在加载的类的现有版本

我有一个利用共享库的WebSphere应用程序。每当对共享库路径中的任何jar进行更新时,都需要重新启动使用它的应用程序以获得最新的更改。是否可以让WAS应用程序在不重新启动的情况下重新加载共享库

我使用的是传统WAS 8.5.5.16。

简短回答:否

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

从你的问题来看,我相信你只是将一个普通的共享库与你的应用程序相关联,所以这并不一定适用,但我要指出,如果你使用一个独立的共享库(它有自己的类加载器)或服务器上配置的共享库加载器,即使重新启动应用程序也是不够的,因为这些库加载器是使用服务器而不是应用程序创建的,所以它们需要重新启动服务器以获取更改。

简短回答:否

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


从你的问题来看,我相信你只是将一个普通的共享库与你的应用程序相关联,所以这并不一定适用,但我要指出,如果你使用一个独立的共享库(它有自己的类加载器)或服务器上配置的共享库加载器,即使重新启动应用程序也是不够的,因为这些库加载器是用服务器创建的,而不是用应用程序创建的,所以它们需要重新启动服务器来获取更改。

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

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

感谢您的长(短)回答,@Jarid。我正在试图找到一种方法来更新这个应用程序,而不必关闭它。如果可能的话,你会建议实现这一点的方法吗?我唯一能想到的就是编写自己的类加载器,并让它处理可能发生变化的类的加载(以及任何依赖于它们的类,因为否则可能会导致LinkageErrors或ClassCastException,尽管我认为无论怎样都很难避免)。您需要一些东西来检查新的类二进制文件,以及在检测到更改时重新生成类装入器的方法。感谢您提供的信息。感谢您的长(短)文回答,@Jarid。我正在试图找到一种方法来更新这个应用程序,而不必关闭它。如果可能的话,你能建议任何方法来实现这一点吗?我唯一能想到的就是编写你自己的类加载器,让它来处理加载可能更改的类(以及任何依赖于它们的类,因为否则可能会导致LinkageErrors或ClassCastException,尽管我认为无论如何都很难避免)。您需要一些检查新类二进制文件的东西,以及在检测到更改时重新生成类加载程序的方法。感谢提供的信息。