我想用javafx做一个应用程序。我刚接触javafx和gradle,所以现在我只是在胡闹。我想尝试的第一件事是将应用程序构建到可执行jar或exe。我试过好几种方法,但从来没有一个简单的jar来执行。当我双击它时它不会执行。当我试图从命令行执行它时,我得到了一个错误:错误:javafx运行时组件丢失,运行这个应用程序需要这些组件。我尝试了许多在web上找到的解决方案,但都没有成功。
这是应用程序的代码:
package org.example;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Label label = new Label("hello world");
Scene scene = new Scene(label);
primaryStage.setScene(scene);
primaryStage.show();
}
}
这是我的build.gradle文件:
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.9'
}
group 'org.example'
version ''
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
}
javafx {
version = "15.0.1"
modules = [ 'javafx.controls','javafx.fxml' ]
}
mainClassName = 'org.example.Main'
jar {
manifest {
attributes 'Main-Class': 'org.example.Main'
}
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
有人知道怎么解决这个问题吗?
2条答案
按热度按时间3vpjnl9f1#
使用
jlink
构建包含javafx模块的java运行时。使用
jpackage
(来自jdk 14和更高版本)使用该运行时绑定应用程序。这将为您提供一个.exe启动程序和特定于平台的安装程序。gradle'exec'任务可以作为构建的一部分轻松地为您运行这两个工具。
为了使事情更简单,您可以考虑使用包含javafx模块的jdk,这样就不必在配置javafxsdk和模块路径时乱来。有来自azul和bellsoft的openjdk构建,包括javafx。
下面是我在jpackage中使用的任务类型的一个示例。我的“appimage”任务复制文件以准备绑定,我的jlink任务创建运行时映像。这个任务创建了一个可运行的应用程序映像,我使用它第二次调用jpackage来生成安装程序。如果您不需要安装程序,也可以只压缩此映像,但每个映像都是特定于平台的,因为它包含本机启动器和要使用的jre:
我真的应该在某个时候为这个东西做一个合适的gradle插件。
有关jpackage的更多信息,请访问https://docs.oracle.com/en/java/javase/14/docs/specs/man/jpackage.html
r6l8ljro2#
如果您希望对像您这样的示例进行一个短期的、有点不稳定的修复,那么可以在与当前类相同的类路径中使用main方法创建另一个类。在该方法的主体中,您将执行main.main(args)。这将诱使程序不认为它是java应用程序,从而使其正常工作。此外,还必须将主类名更改为新类的名称。
资料来源:https://edencoding.com/runtime-components-error/