微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在tomcat中动态重新加载JAR

如何解决在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种选择:

  1. 使用<Context reloadable="true">,但是不建议在已部署的生产应用程序上使用+例如,在这种情况下,例如,如果加载的JAR已损坏,我就无法对其进行控制。

  2. 覆盖Tomcat的类加载器。我不确定这是解决我的问题的最安全的方法

那么,我的问题是,解决我的问题的最好和最安全的方法是什么?我有两个选择对吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。