我想在项目更新之间进行热代码交换,但我还没有找到有关如何动态加载 .class 文件的任何信息。
更具体地说,我想要这样的东西:
lein uberjar
, 获取 some-client-0.0.0-standalone.jar
. java -jar some-client-0.0.0-standalone.jar
运行它. some-client-0.0.1-standalone.jar
,复制到some-client-0.0.0-standalone.jar
目录。 some-client-0.0.0-standalone.jar
现在可以删除了。 请您参考如下方法:
插件框架方式
您已经说过要进行热代码交换,但您真正需要的是松散耦合的模块和在运行时进行解析的能力。坦率地说,任何插件框架都可能有所帮助,包括成熟的 OSGi(将在下面介绍)。
由于您正在执行某种 PoC,我建议您查看以下示例:
可以提出定义simlle升级方案:
以这种方式,元应用程序将能够提供新的或更新的功能而无需重新启动。这样你就可以:
您还可以查看并采用 Waterfront(基于 Clojure 的 Clojure 编辑器)调查结果(可能需要增强生命周期管理等)
In terms of implementation, Waterfront is based on the context pattern. It allows event handlers to communicate in a functional (side-effect free) manner. On top of this there is a plugin-loader mechanism which loads the plugins that are specified in Waterfront's configuration file. This means that functionality can be easily added or removed (extremely useful when debugging!).
OSGI 方法
正如建议的那样,OSGi 似乎是解决您的问题的好方法。另请注意,OSGi 是好的、成熟的,并且提供了很多开箱即用的东西,但它也有些复杂:
顺便说一句,OSGi 是 clojure 社区的长期目标。您可以查看 Clojure Todo :
> better modularization for OSGi etc
> * names
> * no single namespace pool
> * namespaces found via classes, thus tracks classloader and modules
> * deal with import proxying a la Class.forName stack walk?
已经有一些解决方案可用:
第二个项目提供了使用 clojure 和 OSGi 的 Producer-Consumer 示例:
快乐编码。