Clojure 热代码交换 uberjars/.classes

2024-01-15

我希望在项目更新之间进行热代码交换,但我还没有找到有关如何动态加载 .class 文件的任何信息。 更具体地说,我想要这样的东西:

  1. Make lein uberjar, 获得some-client-0.0.0-standalone.jar.
  2. 运行它java -jar some-client-0.0.0-standalone.jar.
  3. 对项目进行更改。获取新的程序版本,some-client-0.0.1-standalone.jar,将其复制到some-client-0.0.0-standalone.jar目录。
  4. 客户端接收更新到新版本所需的命令序列。
  5. (可选)更新资源。不再使用旧 jar 中的资源。
  6. (选修的)some-client-0.0.0-standalone.jar现在可以删除了。

插件框架方法

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

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

  1. 您有一个带有一些扩展点的元应用程序(比喻解释 http://wiki.eclipse.org/FAQ_What_are_extensions_and_extension_points?) 定义
  2. 要升级或替换的功能将作为松散耦合的模块(插件)实现
  3. 元应用程序通过请求或自动执行解析,以便找到更新的“功能”(根据定义的扩展点)

可以提出定义简单的升级方案:

  1. 用户使用应用程序
  2. 用户安装(复制)一个 JAR(其他类型的捆绑包),其中包含一个或多个扩展点的新实现
  3. 用户触发全局系统解析或系统扫描新更新或系统执行解析每次用户尝试访问某些功能

通过这种方式,元应用程序将能够提供新的或更新的功能而无需重新启动。所以你可以:

  1. 尝试使用一些简单的java插件框架(例如,Java 简单插件框架。 5分钟就可以了。没有 XML。 https://code.google.com/p/jspf/这种方法似乎有点难看
  2. 正如建议的那样,使用 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?

已经有一些解决方案可用:

  1. Clojure-osgi-utils https://github.com/pmoriarty/clojure-osgi-utils
  2. 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(使用前将#替换为@)

Clojure 热代码交换 uberjars/.classes 的相关文章

  • 宏、Clojure 与 Common Lisp

    我和我的一些朋友正在开发一个新平台 我们想用 lisp 构建它 主要吸引力是宏 我们都使用 Common Lisp 但我想探索 Clojure 的选择 当我提出这一点时 其中一位说宏观体系 较弱 我想知道这是否属实 以及在哪些领域 就您可以
  • 用于正则表达式匹配及其在字符串中的位置的紧凑 Clojure 代码

    斯图尔特 哈洛威举了个例子 re seq w The quick brown fox 作为在 Clojure 中查找正则表达式匹配项的自然方法 在他的书中 这种构造与匹配器上的迭代进行了对比 如果人们关心的只是一份比赛列表 那就太好了 但是
  • 我从 clojure 和 python 中得到的 hmac 签名略有不同

    我从 python 实现和 clojure 实现中获得的 HMAC SHA1 签名略有不同 我很困惑什么会导致这种情况 Python实现 import hashlib import hmac print hmac new my key my
  • 当每个人都对 OSGi 进行标准化时,为什么 Sun 还要发明另一个模块系统?

    Sun 在 JDK 模块化方面投入了大量精力 其形式为Jigsaw http openjdk java net projects jigsaw 并暗示它也应该成为其他 Java 开发人员选择的模块格式 使用此功能的唯一著名参与者是 NetB
  • 这两个 clojure 函数之间有什么区别和问题?

    对于课程项目的一部分 我正在实现一个函数来从文件中读取一些数据并根据该文件创建图形结构 一整天我问了几个问题 结果就是这样 下面是一个可以正常工作的函数 它首先以惰性序列的形式读入文件 然后循环解析每一行并将其打印出来 defn print
  • 查看 osgi 包的依赖关系?

    我正在 Eclipse 中寻找一个可以以图形方式查看所有 osgi 包的依赖项的工具 请问有人有什么想法吗 STAN 捆绑包和项目依赖关系视图是免费的附加组件 这是一个依赖关系图示例 http stan4j com images stori
  • 有没有办法查看 OSGi 应用程序中注册的服务?

    我有一个运行 Equinox 的 OSGi 应用程序 我想查看该应用程序提供的服务 我怎样才能做到这一点 从 gogo shell 类型 inspect cap service 这将显示所有捆绑包注册的所有服务 如果您想显示特定捆绑包的服务
  • 在 Clojure 中退出 Recur 循环

    我想跳出下面的循环 并在第 10 行计算结果为 true 时返回最佳最小移动 我查看了 print 语句的输出 当第 10 行的计算结果为 true 时 它 找到了我正在查找的数据 但仍然重复出现 在 Clojure 中 有没有办法在语句计
  • 获取调用表单的名称空间

    我想要一个宏this ns这样它就会返回调用它的位置的名称空间 例如 如果我有这段代码 ns nstest main require nstest core as nstest defn ns str x gt x getName name
  • maven 构建 OSGi 的问题(包括依赖项)

    我目前正在从 OSGi iPOJO 和 iPOJO Annotations 开始 并尝试构建一个要在 Felix 中部署的简单组件 不幸的是 我遇到了各种问题 这些问题需要我花几个小时才能解决 或者在浪费时间后我什至无法解决 如下所示 我想
  • 如何管理 OSGi 构建依赖项?

    我们已将 OSGi 运行时 Equinox 嵌入到自定义客户端 服务器应用程序中 以促进插件开发 到目前为止一切进展顺利 由于 Eclipse 内置的清单编辑器 依赖项管理和导出向导 我们一直使用 Eclipse 来构建插件 使用 Ecli
  • “swank-clojure”到底是做什么的,我们有“swank-SOMETHING_ELSE”吗?

    我的肤浅理解是 swank clojure 使 M x slime connect 成为可能 我的意思是 它提供了与 clojure 服务器的连接 例如 lein swank 我的理解正确吗 如果不是 那swank的目的是什么 那么 是否有
  • 将数据库与 Clojure 结合使用

    有哪些使用 Clojure 数据库的方法 我从 Clojure 知道你可以用 Java 做任何事情 但这意味着我最终可能会使用一些过于复杂的东西 比如 Hibernate 这与 Clojure 的简单性相冲突 有什么建议或意见吗 Cloju
  • 如何安装 leiningen 插件?

    如何安装 leiningen 插件 例如 leiningen run 我看到这个叫做 clojars org 的东西 以及如何 推 它 但我没有看到任何关于从中 拉 的东西 如果 Clojars 上有可用的插件 例如 lein run 只需
  • Clojure 符号名称中的美元符号 ($)

    我一直在编写 clojure 解析器并遇到以下语法 defn key Returns the key of the map entry added 1 0 static true java util Map Entry e e getKey
  • webjure 与 compojure?

    我听说过两个基于 Clojure 的 Web 应用程序框架 Webjure 和 Compojure 有人可以告诉我哪个更好吗 现在您可以添加Ring http groups google com group clojure browse t
  • 如何使用clojure中的map函数打印哈希映射列表的每个元素?

    我正在构建一个哈希映射列表 然后将其传递给另一个函数 当我尝试使用打印列表中的每个哈希映射时map它不工作 我可以打印完整列表或获取第一个元素等 defn m a println a map println a 以下仅适用于 repl m
  • 如何在 Karaf 中运行 Vaadin 7 应用程序?

    我几天来一直在寻找这个问题的答案 进行了大量的实验 我需要做什么才能在 Karaf 内使用 Vaadin Web 框架版本 7 运行应用程序 有一些关于它的信息 但我读过的解决方案都不起作用 我在 SO 上发现的唯一相关问题 如何将 Vaa
  • 如何检查spec/col-of中的不同ID

    s def users s coll of user distinct true 上面的规范要求每个用户映射都是不同的 但是我如何指定它来检查不同的 user ids only 不应允许以下集合 id 10 name Jessica id
  • Clojure实现多线程的最佳方法?

    我正在开发一个用 Clojure 编写的 MUD 客户端 现在 我需要两个不同的线程 一种接收用户的输入并将其发送到 MUD 通过简单的套接字 另一种读取 MUD 的输出并将其显示给用户 我应该只使用 Java 线程 还是应该使用一些特定于

随机推荐