我按照https://blog.jetbrains.com/idea/2013/03/packaging-javafx-2-applications-in-intellij-idea-121/中的步骤进行操作,但是在像最后一步那样构建工件时,我遇到了以下错误
错误:Java FX 打包程序:无法构建工件 - fx:deploy在此JDK中不可用。 我知道JavaFX已从Java 11中移除,我的问题是如何构建一个.jar或.exe文件。这里有一个hello world app可以快速测试。我按照https://blog.jetbrains.com/idea/2013/03/packaging-javafx-2-applications-in-intellij-idea-121/中的步骤进行操作,但是在像最后一步那样构建工件时,我遇到了以下错误
错误:Java FX 打包程序:无法构建工件 - fx:deploy在此JDK中不可用。 我知道JavaFX已从Java 11中移除,我的问题是如何构建一个.jar或.exe文件。这里有一个hello world app可以快速测试。在Intelij中,使用JavafX JAR导出选项已经不再起作用了。你可以使用“从带依赖的模块创建Jar”将其导出为常规的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
以下方法适用于我在Windows和Ubuntu上使用IntelliJ使用OpenJDK 11和OpenJFX 11,并成功创建了一个可以在目标机器上仅通过java -jar filename.jar
运行的jar,无需安装JavaFX。请记住,JavaFX jars是平台相关的。因此,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 > 来自具有依赖项的模块
对于主类选择Start.java > 点击确定
Javafx的jar文件应该会被自动提取(如果没有,请手动添加)
点击应用和确定
构建 > 构建构件 > 构建
使用java -jar filename.jar
即可在没有安装JavaFX的机器上正常运行所创建的文件。
C:\Users\me\Desktop\java -jar "C:\Program Files\MyApp\myFX.jar"
。 - Harleychmod +x myFX.jar
。 - Harley为了使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
main
方法中,在launch(args)
行之前。可能有更好的方法来实现相同的行为,而不需要使用try/catch(故意调用异常不是好的实践),但这个解决方案目前可以正常工作。我有同样的问题,经过大量搜索,我在YouTube上找到了解决方案,这是视频链接: https://www.youtube.com/watch?v=F8ahBtXkQzU
您需要将计算机上JavaSDKFX文件中的所有(.dill)文件添加到您要设置在Artifact中的libs中,查看链接以获取更明显的信息。
构件 -> + -> JavaFX 应用程序 -> 从模块中设置应用程序类