我想有热代码项目更新之间的交换,但我还没有找到如何动态地加载.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升级方案可以提出:
- 用户使用的应用程序
- 使用者安装(拷贝)一个JAR(其它类型的束)以及新的执行一个或几个扩展点
- 用户触发的全球系统解决或系统扫描新的更新或系统执行解决每一个齿的用户试图访问某些一块的功能
以这样的方式应用元就能不重启提供新的或更新的功能。 所以你可以:
- 尝试使用一些简单的Java插件框架(如,例如, 简单的Java插件框架,5分钟和它的作品。没有XML。这种做法似乎有点难看
- 使用Clojure的动态性质,建议在这里
您还可以查看和采取海滨(Clojure的用于Clojure的编辑器基础上)(它可能需要以提高生命周期管理等)的调查结果
- 检查模块组合物/插件架构螺纹
- 看看通过代码在SourceForge上的海滨
在执行方面,滨水区是基于背景模式。 它允许事件处理程序在功能(无副作用)方式进行通信。 在此之上有它加载了在海滨的配置文件中指定的插件插件加载器机制。 这意味着功能性可以很容易地添加或移除(调试时非常有用!)。
OSGI方法
至于有人提出的OSGi似乎是为您解决问题的好办法。 请注意OSGi是不错的,成熟的,并提供了很多东西开箱即用,但它也有些复杂:
BTW,OSGi是Clojure的社区长期目标。 您可以检查Clojure的待办事项 :
> 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的utils的
- clojure.osgi
第二个项目中使用的Clojure和OSGi提供生产者 - 消费者例子:
编码愉快。
对于从jar文件严格在运行时重新加载可能需要寻找到OSGi的类加载器 。 对于Clojure的代码,你可以在你的客户端,监听本地端口上,然后当你要重新加载代码连接到该端口并拨打电话,开始nrepl load-file