我想在项目更新之间进行热代码交换,但我还没有找到有关如何动态加载 .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目录。
  • 客户端接收更新到新版本所需的命令序列。
  • (可选)更新资源。不再使用旧 jar 中的资源。
  • (可选)some-client-0.0.0-standalone.jar现在可以删除了。
  • 请您参考如下方法:

    插件框架方式

    您已经说过要进行热代码交换,但您真正需要的是松散耦合的模块和在运行时进行解析的能力。坦率地说,任何插件框架都可能有所帮助,包括成熟的 OSGi(将在下面介绍)。



    由于您正在执行某种 PoC,我建议您查看以下示例:

  • 您有一个定义了一些扩展点 (metaphor explanation) 的元应用程序
  • 要升级或替换的功能将被实现为松散耦合的模块(插件)
  • 元应用程序通过请求或自动执行解析以查找更新的“功能”(根据定义的扩展点)

  • 可以提出定义simlle升级方案:
  • 用户使用应用程序
  • 用户安装(复制)具有一个或多个扩展点的新实现的 JAR(其他类型的包)
  • 用户触发全局系统解析或系统扫描新更新或系统执行解析每个用户尝试访问某些功能

  • 以这种方式,元应用程序将能够提供新的或更新的功能而无需重新启动。这样你就可以:
  • 尝试使用一些简单的 java 插件框架(例如,Java Simple Plugin Framework. 5 minutes and it works. No XML. 这种方法似乎有点难看
  • 使用 clojure 的动态特性,正如所建议的 here

  • 您还可以查看并采用 Waterfront(基于 Clojure 的 Clojure 编辑器)调查结果(可能需要增强生命周期管理等)
  • 查看Modular composition/plugin architecture线程
  • 查看代码waterfront on SourceForge

  • 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-utils
  • clojure.osgi

  • 第二个项目提供了使用 clojure 和 OSGi 的 Producer-Consumer 示例:
  • producer service
  • consumer service

  • 快乐编码。


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!