21

我按照https://blog.jetbrains.com/idea/2013/03/packaging-javafx-2-applications-in-intellij-idea-121/中的步骤进行操作

但是当我尝试在最后一步中构建工件时,我得到了这个错误

在此处输入图像描述

错误:Java FX Packager:无法构建工件 - fx:deploy 在此 JDK 中不可用

在此处输入图像描述

我知道 JavaFX 已从 java11 中删除我的问题是我应该如何构建一个.jar.exe

这是一个用于快速测试的hello world 应用程序。

4

6 回答 6

12

在 Intelij 中不再使用 JavafX JAR 导出选项。您可以使用“具有依赖关系的 Jar-From 模块”将其导出为常规 jar。这将导出一个有效的 Jar,但为了运行它,您需要将 javaFx 路径和模块添加到您的命令中。

获得 jar 后,运行命令应如下所示:

java --module-path PATH_TO_YOUR_JAVAFX_LIB_FOLDER --add-modules javafx.controls,javafx.fxml,javafx.graphics,javafx.web -jar yourJar.jar

我用这个制作了一个 youtube 教程: https ://youtu.be/HGHu-SzL-5E

于 2019-08-31T16:47:03.357 回答
8

以下方法适用于我在 Windows 和 Ubuntu 上使用 IntelliJ 的 OpenJDK 11 和 OpenJFX 11,并成功创建了一个可以java -jar filename.jar在目标机器上不安装 JavaFX 的情况下运行的 jar。请记住,JavaFX jar 依赖于平台。所以Windows jar需要在Windows上编译,Linux jar在Linux上编译。

我的主要方法扩展了应用程序...

public class Main extends Application {

因此,首先创建一个类似于 Start.java 的新 Java 类 - 它链接到原始 Main 方法。

public class Start {
    public static void main(String[] args){
        Main.main(args);
    }
}

然后你制作 .jar 文件;

文件 > 项目结构 > 工件

单击 + > 选择 JAR > 从具有依赖项的模块

对于 Main 类,选择 Start.java > 单击 Ok

javafx jars 应该被自动提取(如果它们不是手动添加的话)

单击应用和确定

构建 > 构建工件 > 构建

java -jar filename.jar即使在没有安装 JavaFX 的机器上,创建的文件也应该可以正常运行。

于 2020-06-06T00:25:28.143 回答
2

不幸的是,您将无法以这种方式使用 JFX11 构建您的 jar,因为显然打包程序已从 JFX SDK 中删除。希望它将在未来的版本(可能是 12 版)中实现。阅读此处了解更多详情:

https://youtrack.jetbrains.com/issue/IDEA-200721包含以下 2 个链接:

https://bugs.openjdk.java.net/browse/JDK-8212780

https://openjdk.java.net/jeps/343

作为临时解决方案,您可以简单地使用/降级到仍然包含所需打包程序的版本 10。

于 2018-11-24T23:53:18.767 回答
1

正如 Barosanu240 回答的那样,IntelliJ 目前无法再导出 JavaFX Jars,尽管这方面的开发正在进行中。此外,他在 YouTube 视频上的解决方案效果很好,因此感谢您发布该视频。

为了在不使用命令行的情况下打开 JAR 文件,应用程序本质上需要使用上面列出的附加 JVM 参数重新启动自身。虽然很混乱,但这可以通过以下方式完成。

假设应用程序在其当前目录中查找一个名为exist.txt 的临时文件。如果此文件不存在,它会创建它,向 CMD 发送命令以使用附加的 JVM 参数启动其自身的另一个实例,然后关闭。然后新打开的实例检查是否存在exist.txt,它现在确实存在;因此,它知道 UI 是开放且可见的。然后它会删除exist.txt,然后应用程序会继续正常运行。

这种方法可以通过一个 try/catch 块来完成,尽管这很混乱,如下所示。

try (FileReader fileRead = new FileReader(new File(Paths.get("").toAbsolutePath().toString() + FileSystems.getDefault().getSeparator() +"exist.txt"))) {
        //If the code gets this far, the file exists. Therefore, the UI is open and visible. The file can now be deleted, for the next time the application starts.

        fileReader.close();
        File file = new File(Paths.get("").toAbsolutePath().toString() + FileSystems.getDefault().getSeparator() +"exist.txt");
        boolean result = file.delete();
        if (result) {
            System.out.println("File deleted successfully; starting update service.");
        } else {
            System.out.println("File was not deleted successfully - please delete exist.txt.");
        }

    } catch (IOException e) {
        //The file does not exist because an exception was generated. Therefore, create the file, and restart the application using CMD with the additional arguments required
        File file = new File(Paths.get("").toAbsolutePath().toString() + FileSystems.getDefault().getSeparator() +"exist.txt");
        try {
            boolean result = file.createNewFile();
            if (result) {
                //Start a new instance of this application
                final String command = "cmd /c start cmd.exe /k java --module-path PATH_TO_YOUR_JAVAFX_LIB_FOLDER --add-modules javafx.controls,javafx.fxml,javafx.graphics,javafx.web -jar yourJar.jar;
                Runtime.getRuntime().exec(command);
            } else {
                System.out.println("Unable to create exist.txt. Application will close.");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        //Now that a new file has been created and a command sent to CMD, exit this instance
        System.exit(-1);
    }

//The rest of your application's code

请注意,JavaFX lib 文件夹的路径不应包含任何空格。上面的代码需要在你的应用程序的main方法中,launch(args)在行之前。可能有更好的方法可以在不使用 try/catch 的情况下实现相同的行为(因为故意调用异常不是好的做法),但这个解决方案暂时可以正常工作。

于 2020-04-23T11:25:54.973 回答
0

我有同样的问题,经过大量搜索后,我在 youtube 上找到了这个视频的解决方案,视频的链接: https ://www.youtube.com/watch?v=F8ahBtXkQzU

您必须将计算机上 JavaSDKFX 文件中的所有(.dill)文件添加到您要在 Artifact 中设置的库中,检查链接以获得更明显的 Info 。

于 2021-05-06T05:51:23.750 回答
0

Artifacts -> + -> javaFx Application -> from modules 然后设置 Application 类

于 2021-06-05T15:00:35.570 回答