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

欢迎!请查看关于页面以了解更多信息。

0
Clojure

我正在尝试为KSQL编写一个用户自定义函数。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如果它在其中。

是类加载器的问题。强制使用线程上下文类加载器使其工作。谢谢。
...