2

我一直在玩弄创建一个程序的想法,该程序可以执行多个不同的任务,同时受到中央线程的监控。这个想法是创建一个核心程序,该程序将在运行时/运行时查找并加载单独的模块。这些模块将执行自己的任务,然后将完成的对象传递给另一个模块,该模块将处理诸如将成品上传到 Web 服务器或将结果数据组织到预定的文件/文件夹结构(见图基本概念)。 在此处输入图像描述 我以前从未真正使用过 Java 中的模块化设计。我过去的所有程序都是完全独立的,所以我几乎不知道从哪里开始。

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

我想知道的是,这可能吗(我假设是这样),如果是的话;我应该研究什么/我将如何进行设置?(我是在尝试重新发明轮子吗?如果是这样,我在哪里可以找到所说的轮子?)

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

不确定它是否与帖子相关,但我在 Eclipse 中完成了所有工作(如果有可用的 IDE 特定工具,值得一提)。

4

2 回答 2

4

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

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

于 2015-03-13T18:00:39.110 回答
0

您不能Class从 a 中卸载 a ClassLoader,但可以ClassLoader通过将对它的所有引用以及对它已加载的类的所有实例的所有引用置为空来从 JVM 中卸载整个。 URLClassLoader是一个很好的起点。

于 2015-03-13T18:09:21.197 回答