【发布时间】:2021-12-14 15:40:52
【问题描述】:
我在 2014 年有一个用 Clojure 和 JavaFX 编写的程序。最近修改了该程序的依赖项以使用 Java 17。简单地替换新版本的依赖项会产生与无法读取新类相关的错误文件格式。我想更新应用程序,但无法使用当前版本的 Java (17) 和 JavaFX (17.0.1) 生成 uberjar。
这里是 project.clj 和 SSCCE 的源文件。
(defproject sutest "0.1.0-SNAPSHOT"
:description "Test for including JavaFX components in uberjar"
:dependencies [[org.clojure/clojure "1.10.3"]
[org.openjfx/javafx-controls "17.0.1"]]
:aot :all
:main sutest.core)
(ns sutest.core
(:gen-class
:extends javafx.application.Application)
(:import
[javafx.application Application Platform]
[javafx.event EventHandler]
[javafx.geometry Insets Pos]
[javafx.scene Scene]
[javafx.scene.control Button Label]
[javafx.scene.layout VBox]))
(defn -start [this stage]
(let [hiLbl (Label. "Hello World!")
exitBtn (Button. "Exit")
root (VBox. 12.0)]
(.setOnAction exitBtn (reify EventHandler (handle [_ _]
(Platform/exit))))
(.setPadding root (Insets. 0 10 0 10))
(.addAll (.getChildren root) [hiLbl exitBtn])
(.setAlignment root Pos/CENTER)
(.setScene stage (Scene. root 250 150)))
(.show stage))
(defn -main [& args]
(Application/launch sutest.core args))
当直接使用lein run 或从 IntelliJ IDEA/Cursive “运行”配置执行时,程序按预期工作。运行 lein uberjar 完成且没有错误,但尝试使用
java -jar target/sutest-0.1.0-SNAPSHOT-standalone.jar
生产
Error: JavaFX runtime components are missing, and are required to run this application
我正在使用 Leiningen 2.9.6,因为 this issue 和 2.9.7。运行程序时,Leiningen 会在本地依赖库中构建一个包含所需 jar 的类路径。
我看到了一些关于将较新的 JavaFX 模块包含在 Java 的“胖”jar 中的问题,并尝试将它们包含在 Leiningen 构建中。很少与 Clojure 和 Java 相关。例如,请参阅 fn-fx 库的 project.clj。这诉诸一个特殊的“泄漏”配置文件来包含模块。由于某种原因,这对我不起作用。
我尝试将模块添加到 IDEA/Cursive 项目中。正确下载了项目信息中的模块,但仍然没有使用模块构建 uberjar。
我也摆弄过 IDEA/Cursive 项目的“Artifacts”部分。但这并不成功。
Gluon 网站上有一些教程介绍了如何制作一个包含 JavaFX 组件的“胖”jar,但这些都是针对 Java 项目的。
可以使用 Leiningen 创建包含依赖项的 uberjar 吗?
如果不是 Leiningen,tools.deps 或 boot 怎么样?
有没有人通过调整 Gluon 指令成功地退回到简单的 Maven 构建?
【问题讨论】:
-
请编辑您的问题以显示您的 jar 的内容。
-
Leiningen 支持classifiers for dependencies。如果您检查您的 jar 内容并且它不包含所需的本机组件,您应该能够通过为这些本机组件创建额外的依赖项来添加它们,就像在执行 shared maven build 的相同任务时所做的那样,至少这就是对我来说很有意义,尽管我不确定,因为我不熟悉您的工具链选择。