[英]clean deployment on linux - java.lang.ClassNotFoundException: javafx.fxml.FXMLLoader
我有一個 Java (JavaFX) 應用程序,它是在筆記本電腦 A 上使用 Gradle 構建的。當我將它部署到筆記本電腦 B 時,它無法運行並拋出以下異常:
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NoClassDefFoundError: javafx/fxml/FXMLLoader
at main.Main.start(Main.java:85)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
... 1 more
Caused by: java.lang.ClassNotFoundException: javafx.fxml.FXMLLoader
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 10 more
我使用 gradle 插件構建了一個可執行的 jar。 它還構建了一個 zip 和 tar 文件。 zip(和 tar)文件包含一個帶有運行應用程序的腳本的 bin 目錄和一個包含大量 jar 文件的 lib 目錄。
Error: JavaFX runtime components are missing, and are required to run this application
我創建了一個包裝器 class ,其中有一個調用主程序(javafx)的主程序(非 javafx)。
干凈安裝 Linux Mint - 19.3 Cinnamon Kernal - 5.3.0-53-generic
gradle-6.0.1
Java版-
openjdk 11.0.7 2020-04-14
OpenJDK Runtime Environment (build 11.0.7+10-post-Ubuntu-2ubuntu218.04)
OpenJDK 64-Bit Server VM (build 11.0.7+10-post-Ubuntu-2ubuntu218.04, mixed mode, sharing)
如果我使用(分解的)zip 文件中的腳本:
./MyApp/bin/MyApp config.json
或者只是執行應用程序:
java -jar MyApp.jar config.json
這兩個都失敗了
使用 ZIP 文件內容,我探索了 jar 文件 gradle 部署。
MyApp.jar
* javafx-graphics-11.jar
* javafx-base-11.jar
javafx-controls-11-linux.jar
javafx-graphics-11-linux.jar
javafx-base-11-linux.jar
joda-time-2.10.5.jar
'*' 文件是代理,只包含一個清單。 'linux' jars 包含 JavaFX 類,但是沒有文件包含: javafx.fxml.FXMLLoader
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
javafx {
version = "11"
modules = [ 'javafx.controls' ]
}
repositories {
mavenLocal()
mavenCentral()
}
sourceCompatibility = '11'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
if (!hasProperty('mainClass')) {
ext.mainClass = 'Main'
}
mainClassName = "Main"
run {
args 'config.json'
}
dependencies {
compile "joda-time:joda-time:2.10.5"
testCompile "junit:junit:4.12"
}
jar {
manifest {
attributes 'Main-Class': 'Main'
}
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
任何人都可以看看我做錯了什么。 這個應用程序需要在一個干凈的系統上運行,除了 Java(最好是 OpenJDK)之外沒有任何期望。
我還希望它在 Windows 10 平台上運行,所以任何人都可以告訴我如何獲得 gradle 構建以包含“win”等效 jar 文件:
javafx-controls-11-win.jar
javafx-graphics-11-win.jar
javafx-base-11-win.jar
親切的問候
斯圖爾特
在 build.gradle 的 javafx 部分中,您需要包含 fxml 模塊:
javafx {
version = "11"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}
Note that I have had some odd problems with version "11" javafx on Linux so you may want to change that to 13 or 14. JavaFX version requires at least JDK 11 so you can bump up JavaFX version without changing your JDK.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.