使用java11构建和部署javafx应用程序

时间:2018-11-23 16:19:49

标签: java intellij-idea javafx java-11 javafx-11

我遵循了https://blog.jetbrains.com/idea/2013/03/packaging-javafx-2-applications-in-intellij-idea-121/

中的步骤

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

enter image description here

  

错误:Java FX打包器:无法生成工件-FX:部署不正确   在此JDK中可用

enter image description here

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

这里有一个hello world app用于快速测试。

6 个答案:

答案 0 :(得分:6)

以下方法适用于我使用IntelliJ的Ubuntu上的OpenJDK 11和OpenJFX 11,并成功创建了一个可以在Windows和Linux上仅运行java -jar filename.jar的jar。

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

public class Main extends Application {

因此,首先创建一个新的Java类,例如Start.java-这将链接到原始的Main方法。

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

然后创建.jar文件;

文件>项目结构>工件

点击+>选择“ JAR”>具有依赖项的模块

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

应该自动提取javafx jar(如果不是手动添加的话)

点击“应用”,然后确定

构建>构建工件>构建

创建的文件仅需运行java -jar filename.jar

答案 1 :(得分:5)

在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

答案 2 :(得分:3)

不幸的是,您将无法以这种方式使用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,该版本仍包含所需的打包程序。

答案 3 :(得分:1)

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

为了在不使用命令行的情况下打开JAR文件,应用程序本质上需要使用上面列出的其他JVM argumemts重新启动自身。尽管比较麻烦,但是可以通过以下方式完成。

假设应用程序在其当前目录中查找一个名为exist.txt的临时文件。如果该文件不存在,它将创建它,将命令发送给CMD以使用附加的JVM参数启动其自身的另一个实例,然后关闭。然后,新打开的实例将检查是否存在exist.txt,并且现在确实存在;因此,它知道用户界面是开放且可见的。然后它将删除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可能有更好的方法来实现相同的行为(因为有目的地调用异常不是一种好习惯),但是此解决方案暂时可以正常工作。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

工件 -> + -> javaFx 应用程序 -> 来自模块 然后设置应用程序类