Clojure RMI 类路径问题

3
我正在尝试使用Clojure实现某些供应商提供的软件的“插件”。以下是有关供应商提供的软件的一些背景信息。它希望我实现特定接口,然后将包含该实现的jar文件放入其服务器上的目录中。然后,当客户端运行软件时,我的实现类会通过RMI从服务器向客户端“发送”,然后接口的实现在客户端上运行。客户端没有我的jar文件(或Clojure jar文件)在其类路径中。只有服务器拥有这些jar文件。RMI似乎足够聪明,可以上传必要的任何依赖项。
我已经成功地在Clojure中构建了一个非常简单的实现,它似乎是有效的。问题是,我希望能够随时更新客户端上的实现。我在我的类中嵌入了repl-server,并且我可以成功连接到它。为了明确起见,repl-server正在客户端上运行,我能够连接到repl并获得提示“clojure.core =>”。但是,repl似乎相当受限制。如果我输入(+ 1 1),我会收到以下错误:“java.lang.ClassNotFoundException:clojure.lang.Numbers”。如果输入(str“kent”),我会得到“java.lang.NoClassDefFoundError:clojure/lang/AFunction”。我输入的大多数内容都会产生类似的结果。但是,我可以做一个简单的def,例如(def x 3),并且x确实被定义了,因此REPL似乎在某种意义上正在运行。
这似乎可能是类路径问题,但我不确定为什么在客户端上运行的“已编译”代码不会有类路径问题,而在同一客户端上运行的repl无法找到核心类。
有任何想法吗?
谢谢。 肯特。
1个回答

2
首先,作为你的RMI客户端的一部分,是否可能分发clojure.jar?基于您对供应商软件的描述,我猜答案是否定的。
其次,clojure.jar的内容和您的RMI对象是否在服务器上的同一个jar文件中,还是它们各自在自己的jar文件中?
这似乎很可能是一个类加载器问题。在Clojure中,每个定义的函数都会生成自己的类文件,然后Clojure通过特定的类加载器进行加载。我IRC每个函数都由自己的类加载器实例加载,以便在重新定义时可以将该函数回收。类似地,我认为RMI使用自己的类加载器在网络上加载远程RMI对象。因此,可能两个类加载器相互交互不良。
抱歉我不能提供更多帮助...
- Lauri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接