2024年Clojure状态调查! 中分享您的想法。

欢迎!请在关于 页面查看更多有关此工作如何进行的详细信息。

0
Clojure

我正在尝试为KSQL编写一个用户自定义函数,使用Clojure。KSQL要求您提供一个带有注释的Java类的uberjar。我使用gen-class和手动编写的用于与Clojure交互的Java文件都尝试过。在两种情况下,uberjar都能正常加载,并且我的类注解通过反射被检测到。但是,一旦涉及Clojure的任何事情(如Clojure.var("clojure.core", "require"))执行,我就会接收到“java.lang.ExceptionInInitializerError”和“java.lang.NoClassDefFoundError: Could not initialize class clojure.java.api.Clojure”之类的异常。感觉像是我肯定漏掉了关于如何构建uberjar的一些东西。或者,这可能是一个类加载器问题。据KSQL显示,它似乎进行了一些类路径隔离,以防止用户自定义函数相互冲突。

1 个答案

0

被选中
 
最佳答案

可能是jar文件无效或与类加载器相关问题 - NoClassDefFoundError 是线程上下文类加载器看不到该类的明显指示。

要检查jar包,您可以执行jar -tf theuber.jar | grep Clojure - 如果它包含,应该会看到clojure/java/api/Clojure.class

by
这是类加载器的问题。通过强制使用线程上下文类加载器,它才得以工作。谢谢。
欢迎使用Clojure问答社区,您在这里可以提出问题并从Clojure社区的成员那里获得答案。
...