请在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

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