如何用JDK 11打开JavaFX .jar文件?

DrM*_*eza 8 java javafx openjfx java-11

我在IntelliJ中创建了一个JavaFX项目.我可以在IntelliJ中运行项目.我在配置中添加了以下代码:

--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml
Run Code Online (Sandbox Code Playgroud)

但是项目的输出.jar文件(由Artifects制作)不会运行.我测试了这些命令,但没有任何机会:

java  --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar Timer.jar
java  --module-path %PATH_TO_FX% --add-modules javafx.controls  Timer.jar
Run Code Online (Sandbox Code Playgroud)

命令行的上一个错误日志:

Error: Could not find or load main class Files\Java\javafx-sdk-11.0.1\lib
Caused by: java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib
Run Code Online (Sandbox Code Playgroud)

ps:在JDK-10上构建时,我可以运行这个项目的.jar文件

编辑:

我下载了JavaFX并将其lib文件夹添加到系统环境中.为了将JavaFX添加到项目中,我执行了以下过程:项目结构>库>添加> Java> JavaFxPath/lib

然后我在此过程中为输出jar文件创建了Artifect:项目结构> Artifects>添加> JAR>从具有依赖项的模块> main类:main.Main.

Jos*_*eda 9

如果您有一个简单的(非模块化)JavaFX 11项目(没有Maven/Gradle构建工具),并且您正在使用IntelliJ,就像这里的HelloFX示例一样,这就是如何从IntelliJ创建一个可以从控制台

有关如何运行该项目的完全手册,可以发现在这里,并就如何创建一个罐子说明这里(见非模块化的项目),但这些并不包括Artifacts来自的IntelliJ.

检查HelloFX项目是否使用以下VM选项从IntelliJ运行:

--module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.fxml
Run Code Online (Sandbox Code Playgroud)

这里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,并接受.

SemiJar

构建项目,它将创建一个相当小的jar(在这种情况下为3 KB).

现在你应该可以运行它:

java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar out\artifacts\HelloFX_jar\HelloFX.jar
Run Code Online (Sandbox Code Playgroud)

(确保%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
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

原因1:您需要一个发射器类,如解释在这里.

所以创建一个启动器类:

public class Launcher {

    public static void main(String[] args) {
        Main.main(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

原因2:如果只添加SDK罐子脂肪罐子,你会错过本机库,为解释在这里.

因此,编辑工件,选择Launcher类作为主类,并添加本机库(Directory Content -> path-to/JavaFX SDK/bin在Windows上):

胖罐子

现在构建项目(现在jar大约33 MB,并包含不必要的本机库)并运行:

java -jar out\artifacts\HelloFX_jar\HelloFX.jar
Run Code Online (Sandbox Code Playgroud)

您可以分发此jar,但仅限于Windows平台.

如果您下载他们的JavaFX SDK,您可以为其他平台创建类似的jar,如果将它们全部添加在一起,您也可以构建跨平台jar,如上面的链接答案中所述.

无论如何,你应该考虑使用jlink 替代.

注意

关于此错误:

引起: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"
Run Code Online (Sandbox Code Playgroud)