我怎样才能制作一个 "modular" Java 程序在 运行 时更新?
How can I make a "modular" Java program that updates while running?
我一直在思考创建一个程序的想法,该程序可以在由中央线程监视的同时执行多个不同的任务。这个想法是创建一个核心程序,它将在 runs/while 运行 时查找并加载单独的模块。这些模块将在将完成的对象传递给另一个模块之前执行自己的任务,该模块将处理诸如将完成的产品上传到 Web 服务器或将结果数据组织到预先确定的 file/folder 结构(基本概念见图片)。
我以前从未真正使用过 Java 中的模块化设计;我过去所有的程序都是完全独立的,所以我几乎不知道从哪里开始。
我的目标是在核心程序中存储外部库(例如 Java 的 AWS SDK,它可以将 .jar 本身拍摄到大约 18MB),以便几乎可以分发单独的模块进行更新时立即进行,而不必为了修复 1 行错误而重新分发整个 18MB 以上的独立程序。此外,我希望能够在必要时更新单个模块,而不必重新启动整个程序,允许其他模块在更新一个模块时继续工作,减少整体停机时间,以便程序唯一需要的时间完全关闭是在对核心进行更新时。
我想知道的是,这可能吗(我假设是),如果是的话;我应该怎么看 into/how 我会着手设置它吗? (我是在重新发明轮子吗?如果是的话,我在哪里可以找到那个轮子?)
我研究了使用 ServiceLoader
并尝试了示例 here,但我不确定如何将一个模块指向另一个模块,或者它是否可以检索来自核心的库 类,也不能做到提到的 "active updating"。到目前为止,我所看到的是(在我的示例中)核心可以访问模块,但我不确定 if/how 模块是否可以访问核心。
不确定它是否与 post 相关,但我在 Eclipse 中完成我的所有工作(如果有可用的 IDE 特定工具,我认为值得一提)。
看看 OSGi,Bundle Structure 基本上就是您要找的东西。
使用 OSGi,您创建 "bundles" 这是带有 ➕ 元数据的 jar,用于告诉运行时(例如可以是 Apache Felix 或 Eclipse Equinox)您的包具有哪些依赖项以及它提供什么。
使用 OSGi,您可以独立于所有其他 Bundle 启动、停止和更新每个 Bundle,它甚至可以根据其他功能停止并在 bundle 更新后重新启动它们(前提是您正确配置了它;))
@bhspencer:只加载新的 jar 并不能正确更新,因为标准 java 类加载器不允许卸载 类.
您无法从 ClassLoader
中卸载 Class
,但您可以通过清空对 ClassLoader
的所有引用以及对 类 它已加载。 URLClassLoader
是一个很好的起点。
我一直在思考创建一个程序的想法,该程序可以在由中央线程监视的同时执行多个不同的任务。这个想法是创建一个核心程序,它将在 runs/while 运行 时查找并加载单独的模块。这些模块将在将完成的对象传递给另一个模块之前执行自己的任务,该模块将处理诸如将完成的产品上传到 Web 服务器或将结果数据组织到预先确定的 file/folder 结构(基本概念见图片)。
我的目标是在核心程序中存储外部库(例如 Java 的 AWS SDK,它可以将 .jar 本身拍摄到大约 18MB),以便几乎可以分发单独的模块进行更新时立即进行,而不必为了修复 1 行错误而重新分发整个 18MB 以上的独立程序。此外,我希望能够在必要时更新单个模块,而不必重新启动整个程序,允许其他模块在更新一个模块时继续工作,减少整体停机时间,以便程序唯一需要的时间完全关闭是在对核心进行更新时。
我想知道的是,这可能吗(我假设是),如果是的话;我应该怎么看 into/how 我会着手设置它吗? (我是在重新发明轮子吗?如果是的话,我在哪里可以找到那个轮子?)
我研究了使用 ServiceLoader
并尝试了示例 here,但我不确定如何将一个模块指向另一个模块,或者它是否可以检索来自核心的库 类,也不能做到提到的 "active updating"。到目前为止,我所看到的是(在我的示例中)核心可以访问模块,但我不确定 if/how 模块是否可以访问核心。
不确定它是否与 post 相关,但我在 Eclipse 中完成我的所有工作(如果有可用的 IDE 特定工具,我认为值得一提)。
看看 OSGi,Bundle Structure 基本上就是您要找的东西。 使用 OSGi,您创建 "bundles" 这是带有 ➕ 元数据的 jar,用于告诉运行时(例如可以是 Apache Felix 或 Eclipse Equinox)您的包具有哪些依赖项以及它提供什么。 使用 OSGi,您可以独立于所有其他 Bundle 启动、停止和更新每个 Bundle,它甚至可以根据其他功能停止并在 bundle 更新后重新启动它们(前提是您正确配置了它;))
@bhspencer:只加载新的 jar 并不能正确更新,因为标准 java 类加载器不允许卸载 类.
您无法从 ClassLoader
中卸载 Class
,但您可以通过清空对 ClassLoader
的所有引用以及对 类 它已加载。 URLClassLoader
是一个很好的起点。