如果您有一个简单的(非模块化)JavaFX 11 项目(没有 Maven/Gradle 构建工具),并且您正在使用 IntelliJ,就像这里的 HelloFX 示例一样,这就是您可以从 IntelliJ 创建一个可以运行的 jar 的方法控制台
可以在此处找到有关如何运行项目的完整教程,并在此处找到有关如何创建 jar 的说明(请参阅非模块化项目部分),但 IntelliJ 并未涵盖这些内容Artifacts
。
检查 HelloFX 项目是否使用以下 VM 选项从 IntelliJ 运行:
--module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.fxml
其中PATH_TO_FX
已设置File -> Settings -> Appearance & Behavior -> Path Variables
,指向 JavaFX SDK库。
半脂罐
我们可以创建一个仅包含项目中的类和第三方依赖项的 Jar,但不包含 JavaFX 依赖项。
转到File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies
,添加您的主要课程,接受。
然后从列表中删除 JavaFX jar,并接受。
构建项目,它将创建一个非常小的 jar(在本例中为 3 KB)。
现在您应该能够像这样运行它:
java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar out\artifacts\HelloFX_jar\HelloFX.jar
(确保它%PATH_TO_FX%
指向一个有效的文件夹,如果它包含空格,则使用引号。
您可以分发此 jar,并在其他平台上运行它,前提是这些平台也具有 JavaFX SDK。
脂肪罐
如果您想要一个包含 JavaFX 依赖项的完整 jar,您仍然可以使用 Artifacts。
转到File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies
,添加您的主要课程,接受。
然后从列表中保留 JavaFX jar,并接受。构建项目。
理论上,您应该能够像这样运行它:
java -jar out\artifacts\HelloFX_jar\HelloFX.jar
但这行不通。
原因 1:您需要一个启动器类,如此处所述。
所以创建一个启动器类:
public class Launcher {
public static void main(String[] args) {
Main.main(args);
}
}
原因 2:如果您只将 SDK jar 添加到 fat jar,您将缺少本机库,如此处所述。
所以编辑工件,选择 Launcher 类作为主类,并添加本机库(Directory Content -> path-to/JavaFX SDK/bin
在 Windows 上):
现在构建项目(现在 jar 大约 33 MB,并且包含不必要的本机库)并运行:
java -jar out\artifacts\HelloFX_jar\HelloFX.jar
您可以分发此 jar,但只能分发到 Windows 平台。
如果您下载他们的 JavaFX SDK,您可以为其他平台创建类似的 jar,如果将它们全部添加在一起,您还可以构建跨平台 jar,如上面链接的答案中所述。
无论如何,您应该考虑使用jlink
instead。
笔记
关于这个错误:
引起:java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib
看起来库路径的设置没有引号,并且缺少路径的第一部分C:\Program Files\...
。只要确保你使用引号:
set PATH_TO_FX="C:\Program Files\Java\javafx-sdk-11.0.1\lib"