【发布时间】:2016-03-13 06:16:02
【问题描述】:
我有一系列包含 JAR 文件的文件夹,这些 JAR 充当我主应用程序的插件。每个单独的 JAR 文件夹都使用自己的类加载器加载,因此该 JAR 文件夹可以独立于其他文件夹进行加载和卸载。
一些 JAR 依赖于其他 JARS。在某些情况下,有多个 JAR(例如,Set A)依赖于同一个单独的 JAR(我们称之为 BaseJar)。出于这个原因,我为这个 BaseJar 设置了一个单独的文件夹,这样我就可以只加载一次,而不会有多个地方可以存在 JAR。
我需要提供可以禁用这些 JAR 集合中的任何一个,然后重新加载的功能。因此,这些插件的任何小更新都可以即时完成,而无需禁用整个应用程序。这引出了我标题中的问题。如果我要卸载这个 BaseJar 类,以便可以更新它,有没有办法避免必须卸载并重新加载 SetAall /em> JAR 也是?我希望他们能够在新的依赖项被单独的类加载器加载后继续正常运行。
编辑:为了澄清我的立场,在给出了一些答案之后,我已经有了一个可以工作的自定义 JarClassLoader。目前我可以加载我所有的插件并卸载它们都很好。我需要知道我是否可以批量加载和卸载,而不影响其他 JAR,这些 JAR 可能使用另一个 JAR 中包含的某些类,该类在运行时升级。
我知道如果我尝试使用该插件在升级过程中可能会出现问题,它尝试使用的类不再由 JVM 加载,因此在更新之前不可用版本已加载。刚刚在这个新类上传之后,会不会导致解决问题?
【问题讨论】:
-
所以你想重新发明 OSGi?
标签: java jar classloader dependency-management