【问题标题】:Dynamic loading of modules in JavaJava中模块的动态加载
【发布时间】:2009-01-06 07:37:13
【问题描述】:

在 Java 中,我可以动态地将内容添加到类路径并加载类(“动态”意味着无需重新启动我的应用程序)。是否有一个已知的框架/库可以处理动态加载/卸载模块而无需重新启动?

通常的设置,尤其是对于网络应用程序,是负载平衡器、多个应用程序实例以及逐步部署和重新启动新版本。我正在寻找其他东西 - 具有多个服务/插件的应用程序,可能是单实例桌面应用程序,其中禁用单个服务很便宜,但关闭或重新启动整个应用程序是不可行的。

我正在考虑典型的插件基础架构,其中插件可以在不重新启动应用程序的情况下升级或安装。我是否必须从头开始对其进行编程,还是已经可以使用? Spring 兼容和开源是一个加分项,但不是必需的。

【问题讨论】:

    标签: java deployment plugins


    【解决方案1】:

    您可以考虑在 OSGI framework 中运行您的 Spring 应用程序。

    我相信DMServer 是一个基于模块的 Java 应用程序服务器,旨在运行企业 Java 应用程序和 Spring 驱动的应用程序,基于 OSGI

    您可以在这篇Hello, OSGi, Part 2: Introduction to Spring Dynamic Modules 文章中找到更多详细信息,特别是如何使用 Spring DM 在正在运行的系统中动态安装、更新和卸载模块。


    注意:当您谈到“无需重新启动应用程序即可升级或安装插件”时,OSGI 是第一个想到的候选框架。

    这完全是关于将应用程序模块化成更小的包。
    每个包都是一个紧密耦合、可动态加载的类、jar 和配置文件的集合,这些文件明确声明了它们的外部依赖项(如果有的话)。

    【讨论】:

      【解决方案2】:

      也许最简单的方法是用它自己的类加载器加载每个插件。然后丢弃类加载器并创建一个新的以重新加载插件。您将希望插件 API 中的 init() 和 destroy() 方法允许启动/关闭类型的功能。

      这还具有将插件彼此隔离的优点。

      URLClassLoader 是您的起点。一般的想法是您提供一个 XxxPlugin 超类,任何插件子类。以 Applet 为例,它本质上是一个 GUI 插件(或 Midlet 等)。

      【讨论】:

        猜你喜欢
        • 2010-10-20
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        相关资源
        最近更新 更多