如何解决在tomcat中动态重新加载JAR
我在Tomcat中运行Jersey服务。我尝试在具有新版本时重新加载我的JAR内容。我的服务具有IManager的实例管理器类型,其实现是通过反射加载的。
private IManager manager;
从stackoverflow中的不同论坛和问题中,我了解到要在JVM中重新加载类,我必须实现我的Classloader,这是由于默认的ClassLoader假定类定义在JVM的整个生命周期中都不会改变,并且不读磁盘上的新版本。
因此,我实现了我的ClassLoader,但是下一个代码中存在问题:
private IManager manager;
public void loadManager() {
MyWebAppLoader loader = new MyWebAppLoader(classesPathnorm,libPathnorm);
Class<?> managerClass = loader.loadClass("mycompany.Manager");
//EXCEPTION HERE: mycompany.Manager cannot be cast to mycompany.IManager
manager = (IManager) managerClass.newInstance();
}
我知道问题是IManager和Manager具有不同的ClassLoader(CatalinaClassLoader VS MyWebAppLoader)。据我了解,我有2种选择:
-
使用
<Context reloadable="true">
,但是不建议在已部署的生产应用程序上使用+例如,在这种情况下,例如,如果加载的JAR已损坏,我就无法对其进行控制。
那么,我的问题是,解决我的问题的最好和最安全的方法是什么?我有两个选择对吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。