我遵循了https://blog.jetbrains.com/idea/2013/03/packaging-javafx-2-applications-in-intellij-idea-121/
中的步骤但是当我尝试构建工件时,就像在最后一步中一样,我得到了这个错误
错误:Java FX打包器:无法生成工件-FX:部署不正确 在此JDK中可用
我知道JavaFX已从java11中删除,我的问题是应该如何构建.jar
或.exe
这里有一个hello world app用于快速测试。
答案 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 应用程序 -> 来自模块 然后设置应用程序类