Clojure未生成类致JavaFX项目运行失败求助
解决Clojure + JavaFX运行时ClassNotFoundException问题
问题原因
你的代码使用了:gen-class :extends javafx.application.Application,需要Clojure编译生成字节码文件,但默认运行命令未触发编译流程,导致找不到编译后的类文件,也无法生成target目录。同时JavaFX作为模块化库,运行时必须指定模块路径和模块参数,否则还会引发后续运行异常。
解决方案
步骤1:确认项目结构与命名空间匹配
确保代码文件路径为src/myname/myapp.clj,与命名空间myname.myapp完全对应——clj-new创建的项目默认遵循此结构,若手动修改过路径需调整一致。
步骤2:更新deps.edn配置
修改deps.edn,添加JavaFX的JVM模块参数,确保运行配置能触发编译:
{:deps {org.clojure/clojure {:mvn/version "1.11.1"} org.openjfx/javafx-controls {:mvn/version "17.0.2"} org.openjfx/javafx-base {:mvn/version "17.0.2"} org.openjfx/javafx-graphics {:mvn/version "17.0.2"} org.openjfx/javafx-media {:mvn/version "17.0.2"} org.openjfx/javafx-web {:mvn/version "17.0.2"}} :aliases {:run-m {:main-opts ["-m" "myname.myapp"] :jvm-opts ["--module-path" "/你的JavaFXSDK路径/lib" "--add-modules" "javafx.controls,javafx.base,javafx.graphics,javafx.media,javafx.web"]}}}
注意:替换
/你的JavaFXSDK路径为本地JavaFX SDK的实际路径,例如/Users/xxx/Downloads/javafx-sdk-17.0.2
步骤3:编译并运行项目
有两种可行的运行方式:
方式一:手动编译后运行
- 执行编译命令,生成
target目录和类文件:
clj -M compile myname.myapp
- 运行项目:
clj -M:run-m
方式二:直接运行(自动触发编译)
直接执行带主命名空间的命令,Clojure会自动编译带:gen-class的文件:
clj -M --module-path "/你的JavaFXSDK路径/lib" --add-modules "javafx.controls,javafx.base,javafx.graphics,javafx.media,javafx.web" -m myname.myapp
额外说明
- 若不想手动指定JavaFX SDK路径,可使用Maven依赖的自动模块参数,但需确保JDK版本为11+(JavaFX 17要求)。
- 确认macOS系统的JDK版本与JavaFX 17兼容,建议使用JDK 17。
内容的提问来源于stack exchange,提问作者keriuz
相关产品推荐
相关产品推荐

