如果你有一个简单的(非模块化的)JavaFX 11项目(没有Maven/Gradle构建工具),并且你正在使用IntelliJ,就像这里的HelloFX示例一样,这就是你如何从IntelliJ创建一个可以从控制台运行的jar。
可以在此处找到有关如何运行项目的完整教程,以及有关如何创建jar的说明(请参阅非模块化项目部分),但这些并不涉及IntelliJ。Artifacts
检查 HelloFX 项目是否从 IntelliJ 运行,并使用以下 VM 选项:
--module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.fxml
where 已设置在 中,指向 JavaFX SDK 库。PATH_TO_FX
File -> Settings -> Appearance & Behavior -> Path Variables
半脂罐
我们可以创建一个 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 添加到胖 jar 中,您将缺少本机库,如此处所述。
因此,编辑工件,选择启动器类作为主类,然后添加本机库(在Windows上):Directory Content -> path-to/JavaFX SDK/bin
现在构建项目(现在jar大约是33 MB,并且包含不必要的本机库)并运行:
java -jar out\artifacts\HelloFX_jar\HelloFX.jar
您可以分发此 jar,但只能分发到 Windows 平台。
如果您下载了其他平台的 JavaFX SDK,则可以为其创建类似的 jar,如果将它们全部添加在一起,也可以构建跨平台 jar,如上面的链接答案中所述。
无论如何,您应该考虑使用。jlink
注意
关于此错误:
Caused: 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"