java - Java 中可动态加载和卸载的应用程序模块 - 如何实现?

标签 java dynamic-loading

我正在编写一个使用外部模块的服务器应用程序。我想让它们无需重启服务器即可升级。我怎么做?我找到了 OSGi但对于我的任务来说它看起来非常复杂和庞大。

简单的 *.jar 文件没问题,但我想一旦它们被加载,我就无法从 VM 中卸载它们并即时替换为另一个版本。

您有什么建议?

最佳答案

看来 OSGi 正是您所要求的。它可能很复杂,但有一些方法可以解决这个问题。通过使用 SpringDM 或类似的东西来处理在运行时注册和使用服务的样板任务,可以减轻一些复杂性。注解驱动的服务注册和依赖注入(inject)确实减少了需要编写的代码量。

另一种降低复杂性的方法是将大部分应用程序部署在一个 bundle 中,并且只将需要模块化的部分部署到它们自己的 bundle 中。这减少了您在运行时注册和使用来自其他 bundle 的服务的风险,并降低了部署的复杂性。在一个包中运行的代码可以使用同一个包中的其他代码,就像在标准 Java 应用程序中一样——无需与 OSGi 运行时交互。这种方法的反面是将您的应用程序分解为许多离散的 bundle ,这些 bundle 将定义明确的服务导出到系统中的其他 bundle 。虽然这是一种非常模块化的方法,但它确实带来了管理所有这些 bundle 的额外复杂性以及与 OSGi 运行时的更多交互。

我建议您阅读“OSGi 实战”一书以了解问题并查看一些不错的示例。

关于java - Java 中可动态加载和卸载的应用程序模块 - 如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5486903/

相关文章:

java - 用 lambda 替换 for 循环

java - Eclipse 应用程序运行配置到 intellij

java - 无法调用 Comparator 泛型类中的实例方法

c# - 从不同的程序集动态加载类(具有自定义行为)?

javascript - 动态加载JS 动态加载更多JS

linux - 加载的 ELF 段的重叠映射

java - 我的 Oracle SQL 语句有什么问题?我不断收到“此处不允许列”错误?

java - 使用JAVA将字节流传输到HDFS

javascript - $.html 将脚本呈现为内容

C++ GetProcAddress() 找不到静态类的方法