我希望在项目更新之间进行热代码交换,但我还没有找到有关如何动态加载 .class 文件的任何信息。
更具体地说,我想要这样的东西:
- Make
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,我建议您查看以下示例:
- 您有一个带有一些扩展点的元应用程序(比喻解释 http://wiki.eclipse.org/FAQ_What_are_extensions_and_extension_points?) 定义
- 要升级或替换的功能将作为松散耦合的模块(插件)实现
- 元应用程序通过请求或自动执行解析,以便找到更新的“功能”(根据定义的扩展点)
可以提出定义简单的升级方案:
- 用户使用应用程序
- 用户安装(复制)一个 JAR(其他类型的捆绑包),其中包含一个或多个扩展点的新实现
- 用户触发全局系统解析或系统扫描新更新或系统执行解析每次用户尝试访问某些功能
通过这种方式,元应用程序将能够提供新的或更新的功能而无需重新启动。所以你可以:
- 尝试使用一些简单的java插件框架(例如,Java 简单插件框架。 5分钟就可以了。没有 XML。 https://code.google.com/p/jspf/这种方法似乎有点难看
- 正如建议的那样,使用 Clojure 的动态特性here https://stackoverflow.com/questions/1810231/defining-a-spi-in-clojure
您还可以查看并采用 Waterfront(基于 Clojure 的 Clojure 编辑器)的发现(可能需要增强生命周期管理等)
- 检查模块化组合/插件架构 https://groups.google.com/forum/?fromgroups=#!topic/clojure/irCGydnCNdA thread
- 查看代码SourceForge 的海滨 http://sourceforge.net/projects/waterfront/
在实施方面,滨水区是基于上下文的
图案。它允许事件处理程序以功能方式进行通信
(无副作用)方式。最重要的是有一个插件加载器
加载 Waterfront 中指定的插件的机制
配置文件。这意味着可以轻松添加功能
或删除(在调试时非常有用!)。
OSGI方法
正如所建议的,OSGi 似乎是解决您的问题的好方法。另请注意,OSGi 很好、成熟,并且提供了很多开箱即用的东西,但它也有些复杂:
顺便说一句,OSGi 是 clojure 社区的长期目标。你可以检查Clojure Todo http://clojure.org/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 https://github.com/pmoriarty/clojure-osgi-utils
- Clojure.osgi https://github.com/aav/clojure.osgi
第二个项目提供了使用 clojure 和 OSGi 的生产者-消费者示例:
-
生产性服务业 https://github.com/aav/clojure.osgi/blob/master/clojure.osgi.example.service.producer/src/clojure/osgi/example/service/producer/service_producer.clj
- 消费者服务 https://github.com/aav/clojure.osgi/blob/master/clojure.osgi.example.service.consumer/src/clojure/osgi/example/service/consumer/service_consumer.clj
快乐编码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)