如何让Quarkus识别Clojurephant构建的Clojure类?
在Quarkus中使用Clojure的类加载问题解决
问题背景
用Clojurephant插件在Quarkus里集成Clojure时,触发java.lang.ClassNotFoundException: joy.Interop错误。该插件在Vert.x、SpringBoot环境下运行正常,推测是Quarkus类加载机制导致无法找到Clojure编译后的类,需要调整类路径配置。
报错信息
Caused by: java.lang.ClassNotFoundException: joy.Interop at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:518) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:518) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468) ... 15 more
复现步骤
- 执行命令:
./gradlew quarkusDev - 访问地址触发错误:
http://localhost:8080/hello
解决方法
1. 给Quarkus添加额外类路径
在build.gradle中配置Quarkus插件,把Clojurephant编译输出目录加入类路径:
quarkus { extraClasspath += files("${project.buildDir}/classes/clojure/main") }
Clojurephant默认将编译后的Clojure类输出到build/classes/clojure/main,这个配置能让Quarkus扫描到该目录下的类。
2. 修改Clojurephant编译输出目录
让Clojure编译后的类直接输出到Quarkus默认扫描的类路径目录,在build.gradle中添加:
clojure { compilation { outputDir = file("${project.buildDir}/classes/java/main") } }
Quarkus会自动加载build/classes/java/main下的类,无需额外配置类路径。
3. 通过application.properties指定类路径
在src/main/resources/application.properties中添加:
quarkus.class-path=../build/classes/clojure/main
注意路径需根据项目实际结构调整,确保指向Clojure编译类的目录。
4. 调整Clojure依赖的类加载优先级
如果是Clojure核心库加载冲突,在application.properties中设置父类加载器优先加载Clojure:
quarkus.class-loader.parent-first-artifacts=org.clojure:clojure
同时确保build.gradle中Clojure依赖配置正确:
dependencies { implementation 'org.clojure:clojure:1.11.1' clojureImplementation 'org.clojure:clojure:1.11.1' }
内容的提问来源于stack exchange,提问作者Takis
相关产品推荐
相关产品推荐

