我怎样才能制作一个模块化的"运行时更新的Java程序?

时间:2015-03-13 17:55:07

标签: java modular-design

我一直在想着创建一个程序,该程序可以在被中心线程监视的同时执行多个不同的任务。我们的想法是创建一个核心程序,在运行/运行时查找并加载单独的模块。这些模块将在将完成的对象传递给另一个模块之前执行自己的任务,该模块将处理诸如将成品上载到Web服务器或将结果数据组织成预定文件/文件夹结构的事物(参见图像基本概念)。 enter image description here 我以前从未真正使用过Java中的模块化设计;我以前的所有程序都是完全自包含的,所以我几乎几乎没有线索从哪里开始。

我的目标是将外部库存储在核心程序中(例如,AWS SDK for Java,它可以自动拍摄大约18MB的.jar),以便在进行更新时几乎可以立即分发单独的模块而不是必须重新分发整个18MB +自包含程序只是为了解决1行错误。此外,我希望能够在必要时更新单个模块,而无需重新启动整个程序,允许其他模块在更新一个模块时继续工作,从而减少整体停机时间,以便只需要程序完全关闭是指对核心进行更新。

我想知道的是,这是否可能(我假设是这样),如果是的话;我该怎么看/如何进行设置? (我是否试图重新发明轮子?如果是这样,我在哪里可以找到轮子?)

我研究过使用ServiceLoader并使用示例here,但我不确定如何将一个模块指向另一个模块,或者它是否可以检索库来自核心的类,也不能进行所提到的“主动更新”。到目前为止,我所看到的是(在我的示例中)核心可以访问模块,但我不确定模块是否/如何访问核心。

不确定它是否与帖子相关,但我在Eclipse内部完成所有工作(如果有特定于IDE的工具,请参考值得一提)。

2 个答案:

答案 0 :(得分:4)

看看OSGi,Bundle Structure基本上就是你要找的东西。 使用OSGi,您可以使用➕元数据创建“捆绑包”,这些包可以告诉运行时(例如,可以是Apache Felix或Eclipse Equinox),您的捆绑包具有哪些依赖依赖性以及它提供的内容。 使用OSGi,您可以独立于其他所有捆绑包启动和停止并更新每个捆绑包,它甚至可以根据其他功能停止,并在捆绑更新后重新启动它们(假设您已正确配置它们);)

@bhspencer:只是加载新的jar不允许你正确更新,因为标准的java类加载器不允许卸载类。

答案 1 :(得分:0)

您无法从Class卸载ClassLoader,但您可以通过清空对它的所有引用和所有类的实例来从JVM卸载整个ClassLoader它载满了。 URLClassLoader是一个很好的起点。