簡體   English   中英

線程“main”中的 JavaFX 異常 java.lang.NoClassDefFoundError: javafx/application/Application

[英]JavaFX Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application

我收到這個錯誤

Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Ap
plication
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 13 more

嘗試運行我的類文件時,這是源

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.util.concurrent.Executor;

public class TestApplication extends Application{

    @Override
    public void start(Stage stage) throws Exception {
        new TestApplication();
    }

    public TestApplication() {
        try{
            final Parent root = FXMLLoader.load(Executor.class.getResource("test.fxml"));
            final Stage stage = new Stage(){{
                setScene(new Scene(root, 300, 250));
                setTitle("Test");
                setResizable(false);
                show();
            }};
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

fxml 文件包含一個簡單的 gui。

在過去的幾個小時里,我一直在處理同樣的問題。 盡管我沒有看到它明確地編寫,但似乎您必須使用其中一種 JavaFX 打包工具,它是 Ant 任務或 javafxpackager 可執行文件。 (請參閱http://docs.oracle.com/javafx/2/deployment/packaging.htm ,第 5.3.1 節)。 NetBeans IDE 使用 Ant 來打包代碼。 (我正在使用 IntelliJ)

當您使用其中一種打包方法時,除了應用程序的所有代碼和資源之外,它還會將以下內容添加到您的輸出 JAR 文件中:

/com/javafx/main/Main$1.class
/com/javafx/main/Main$2.class
/com/javafx/main/Main.class
/com/javafx/main/NoJavaFXFallback.class

有了這些,您可以從命令行運行應用程序:

java -jar outjar.jar

一切正常。 如果我刪除額外的 com.javafx.main 文件,該應用程序不會運行。

為了仔細檢查這一點,我查看了 JavaFX 示例中的所有四個 JAR 文件(BrickBreaker、Ensemble、FXML-LoginDemo 和 SwingInterop)。 他們也都有“額外”的文件。

對於我的小型測試應用程序,我使用這個命令行來構建一個“可執行”的 JAR 文件:

javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1

希望這可以幫助!

我遇到了同樣的問題,以下步驟幫助我解決了它,

在運行應用程序時添加 vm 參數,

--module-path  /home/user/Java-libraries/openjfx-11.0.2_linux-x64_bin-sdk/javafx-sdk-11.0.2/lib/ --add-modules javafx.controls,javafx.fxml

筆記:

  • --module-path 將包含 Java fx 的 jars
  • 我使用了 open-jdk 13

在你的 eclipse 中配置這個(如果你正在使用)或者你可以像這樣編譯和運行,

編譯

javac --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml *.java

java --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml MyMainClass

我知道這可能不是啟動 javafx 應用程序的“正確”方式,但我一直在努力解決這個問題,並提出了一種不需要使用任何外部打包應用程序的解決方法,強制您使用 ant 或 maven插件(與陰影插件沖突)等...

該解決方案使用 Utils4j 在運行時動態加載 jfxrt。 您不能在擴展 javafx.application.Application 的類中加載它,請在單獨的類中加載它並為其命名,例如:Launcher

import org.fuin.utils4j.Utils4J

public class Launcher {

    public static void main(String[] args) {
        Utils4J.addToClasspath("file:///"+System.getProperty("java.home")+ File.separator+"lib"+File.separator+"jfxrt.jar");

// CODE TO RUN YOUR CLASS THAT EXTENDS javafx.application.Application goes here.

    }
}

您可以在您的項目中包含 Utils4j(如果使用 maven):

    <dependency>
        <groupId>org.fuin</groupId>
        <artifactId>utils4j</artifactId>
        <version>0.7.0</version>
    </dependency>

使用 java 8 不應該出現這個問題,但對我來說確實如此

我最初從 Eclipse Export -> Runnable Jar 創建了我的 jar,它很好。 當我搬到 Maven 時,它因上述原因而失敗。

比較這兩個 jar 表明,jar 中沒有打包任何與 fx 相關的內容(正如我所期望的那樣),但是 Eclipse 生成的清單具有Class-Path: . 在里面。 讓 maven 使用以下內容打包 jar(使用 Java 8)

 <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>com.pg.fxapplication.Main</mainClass>
            </manifest>
              <manifestEntries>
                    <Class-Path>.</Class-Path>
                </manifestEntries>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>

我相信我的例子會對某人有所幫助。 我沒有成功構建真正可執行的 jar 文件,該文件可以通過從任何位置/目錄使用 Java 8 單擊運行。移動到 Java 11 和其他一些 twicks 完成了這項業務。

  1. 移至Java 11。指定SDK,IDE中的其他人員,將其添加到pom.xml

     <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target>
  2. 添加 JavaFX 依賴項

     <!--JavaFX--> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx</artifactId> <version>15.0.1</version> <type>pom</type> </dependency> <!--JavaFX-controls--> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>15.0.1</version> </dependency>
  3. 構建應用程序

  4. 為您的 Main 類創建包裝類,它擴展了 Application

     public class Launcher { public static void main(String[] args) { Main.main(args); } }
  5. 將以下內容添加到 pom.xml

     <build> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>path-to-launcher.Launcher</mainClass> </manifest> <manifestEntries> <Class-Path>.</Class-Path> </manifestEntries> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <finalName>final-jar-file-name</finalName> <archive> <manifest> <mainClass>path-to-launcher.Launcher</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <appendAssemblyId>false</appendAssemblyId> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
  6. 運行這個 Maven 命令

     mvn clean -Dmaven.clean.failOnError=false compile assembly:single -DskipTests=true

指定名稱的 jar 文件將出現在目標目錄中。 它將是獨立於您運行它的位置的可執行文件。

我使用 maven,我只運行這個mvn install:install-file -Dfile="/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfxrt.jar" -DgroupId=com.oracle.javafx -DartifactId=javafx -Dversion=2.2 -Dpackaging=jar在終端(可能在 Windows 中有點不同。)。 然后 maven 將安裝jfxrt.jar然后你可以簡單地將它引用為

<dependency>
  <groupId>com.oracle.javafx</groupId>
  <artifactId>javafx</artifactId>
  <version>2.2</version>
</dependency> 

如果您像我一樣使用 netbeans 並且安裝了兩個版本的 JDK,那么您應該在配置文件中將類路徑更改為相應的 java 安裝。 這也是 Netbeans 中的一個錯誤:有兩種方法可以做到:
通過執行以下命令使用 --jdkhome 啟動 NetBeans:

"C:\Program Files\NetBeans Dev 201402160001\bin\netbeans.exe" --jdkhome "C:\Program Files\Java\jdk1.7.0_51"

或者在 /etc/netbeans.conf 中設置“netbeans_jdkhome”屬性,例如

# Default location of JDK, can be overridden by using --jdkhome <dir>:
netbeans_jdkhome="C:\Program Files\Java\jdk1.7.0_51"

IntelliJ 和其他 IDE 可能不會重構您的運行/調試配置。 您必須在 Main 類名稱之前手動更改包名稱。 例如,將 'sample.Main' 更改為 'com.company.package.ui.Main' 以便下次嘗試運行它時它會正確啟動。 IDE 可能已經用紅叉標記了運行/調試按鈕,因為它找不到主類。 當您打開運行/調試配置時,它還會發出警告。

我已經在“Ask ubntu”上回答了。 我建議您使用https://openjfx.io/openjfx-docs/ 。我使用的是 Eclipse IDE,但它適用於所有 IDE

然后你可以在設置 VM 選項時引用這個全局變量:

在IDE中右鍵單擊項目->運行方式->運行配置->參數->VM參數

對於 Windows,

--module-path "\\path to javafx\\lib" --add-modules javafx.controls,javafx.fxml

對於 Linux,

--module-path /path to javafx/lib --add-modules javafx.controls,javafx.fxml

我正在 Linux 上開發一個簡單的 WebApp 我遇到了同樣的錯誤,但修復它真的很容易(假設您像我一樣在命令行上開發)。

cat compile.sh 
 #!/bin/bash

 /usr/lib/jvm/jdk1.7.0_25/bin/javac WebViewSample.java  -cp /usr/lib/jvm/jdk1.7.0_25     
 /jre/lib/jfxrt.jar

 $ cat run.sh 
 #!/bin/sh
 JAVA_HOME=/usr/lib/jvm/jdk1.7.0_25/bin/
 CLASSPATH=/usr/lib/jvm/jre1.7.0_25/lib/jfxrt.jar:. 

 $JAVA_HOME/java -cp $CLASSPATH WebViewSample $* 2>&1 /dev/null | awk -F\| '{ print  $2"|"$3  ; exit $1 }'

 exit $?

我遇到了無法從 javafx 找到Pair類的問題。

似乎 vanilla eclipse(沒有e(fx)clipse擴展名)不會搜索 java 中包含的 javaFX 運行時 jar。

我剛剛將這個外部 jar 添加到我的 eclipse 項目構建路徑中(或者,如果您處於調試配置中,請在調試配置的 JRE 選項卡中添加外部 jar):

$JAVA_HOME/jre/lib/ext/jfxrt.jar

(將 JAVA_HOME 替換為您的 jdk 文件夾)

對我來說它在 /installs/jdk1.8.0_211/jre/lib/ext/jfxrt.jar

在eclipse環境中:將jfxrt.jar添加到MANIFEST.MF文件中的Bundle-ClassPath。

Bundle-ClassPath: .,
jfxrt.jar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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