簡體   English   中英

在 linux - java.lang.ClassNotFoundException 上進行干凈部署:javafx.fxml.FXMLLoader

[英]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

我在這里找到了解決方案:

缺少 Maven 燈罩 JavaFX 運行時組件

我創建了一個包裝器 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

我的-build.gradle

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM