在Java中,我可以动态地向classpath添加内容并加载类(“动态”意味着不重新启动我的应用程序)。是否有一个已知的框架/库来处理模块的动态加载/卸载而不重启?
通常的设置,特别是对于web-apps,是负载均衡器,多个应用程序实例,以及逐步部署和重新启动新版本。我正在寻找其他东西 - 具有多个服务/插件的应用程序,可能是单实例桌面应用程序,其中禁用单个服务很便宜,但是关闭或重新启动完整的应用程序是不可行的。
我正在考虑典型的插件基础架构,可以在不重新启动应用程序的情况下升级或安装插件。我是否必须从头开始编程,或者已经可以使用? Spring兼容和开源是一个优点,但不是一个要求。
答案 0 :(得分:10)
您可以考虑在 OSGI framework 中运行spring应用程序。
我相信DMServer是一个基于模块的Java应用服务器,旨在运行企业Java应用程序和基于Spring的应用程序,基于OSGI
您可以在这篇Hello, OSGi, Part 2: Introduction to Spring Dynamic Modules文章中找到更多详细信息,特别是如何使用Spring DM在正在运行的系统中动态安装,更新和卸载模块。
注意:当您谈到“可以在不重新启动应用程序的情况下升级或安装插件”时,OSGI是第一个想到的候选框架。
所有关于应用程序模块化为更小的捆绑包 每个bundle都是一个紧密耦合,可动态加载的类,jar和配置文件集合,它们明确声明了它们的外部依赖性(如果有的话)。
答案 1 :(得分:3)
也许最简单的方法是使用自己的类加载器加载每个插件。然后丢弃类加载器并创建一个新的加载插件。您将需要插件API中的init()和destroy()方法,以允许启动/关闭类型功能。
这也具有将插件彼此隔离的优点。
URLClassLoader是您的出发点。一般的想法是你提供任何插件子类的XxxPlugin超类。考虑一下Applet的例子,它本质上是一个GUI插件(或Midlet等)。