it-swarm.com.de

JavaFX Ausnahme im Thread "main" Java.lang.NoClassDefFoundError: javafx/application/Application

Ich bekomme diesen Fehler

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

Wenn Sie versuchen, meine Klassendatei auszuführen, ist dies die Quelle

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();
        }
    }
}

Die fxml-Datei enthält eine einfache GUI.

22
Archey

Ich habe in den letzten Stunden an demselben Thema gearbeitet. Obwohl ich es nicht explizit geschrieben gesehen habe, scheint es, dass Sie MÜSSEN eines der JavaFX-Paketierungswerkzeuge verwenden, das entweder eine Ant-Task oder die ausführbare Datei des Javafxpackager ist. (Siehe http://docs.Oracle.com/javafx/2/deployment/packaging.htm , Abschnitt 5.3.1). Die NetBeans IDE verwenden Ant, um den Code zu packen. (Ich benutze IntelliJ)

Wenn Sie eine dieser Verpackungsmethoden verwenden, fügt sie zusätzlich zum gesamten Code und den Ressourcen Ihrer Anwendung der JAR-Ausgabedatei Folgendes hinzu:

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

Mit diesen Funktionen können Sie die App über die Befehlszeile ausführen:

Java -jar outjar.jar

und alles funktioniert gut. Wenn ich die zusätzlichen Dateien com.javafx.main entferne, wird die App nicht ausgeführt.

Um dies noch einmal zu überprüfen, habe ich mir alle vier JAR-Dateien in den JavaFX-Beispielen (BrickBreaker, Ensemble, FXML-LoginDemo und SwingInterop) angesehen. Sie alle haben auch die "zusätzlichen" Dateien.

Für meine kleine Test-App habe ich diese Befehlszeile verwendet, um eine "ausführbare" JAR-Datei zu erstellen:

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

Hoffe das hilft!

13
Rob Stoecklein

Die Verwendung von Java 8 sollte dieses Problem nicht verursachen, aber es war für mich der Fall

Ich habe mein Glas ursprünglich aus Eclipse Export -> Runnable Jar erstellt und es war in Ordnung. Als ich zu Maven zog, scheiterte es mit dem oben genannten. 

Beim Vergleich der beiden Gläser zeigte sich, dass nichts, was mit fx in Verbindung steht, mit dem Glas verpackt war (wie ich es erwartet hatte), aber dass das von Eclipse generierte Manifest Class-Path: . darin hatte. Wie ich das Paket mit den folgenden Paketen packen konnte, funktionierte für mich (mit 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>
2
user1276925

IntelliJ und möglicherweise andere IDEs ändern Ihre Run/Debug-Konfiguration nicht. Sie müssen den Paketnamen vor dem Namen Ihrer Hauptklasse manuell ändern. Ändern Sie zum Beispiel "sample.Main" in "com.company.package.ui.Main", damit es beim nächsten Start korrekt gestartet wird. Die IDE hat die Schaltfläche Run/Debug möglicherweise bereits mit einem roten Kreuz markiert, da sie die Hauptklasse nicht finden konnte. Es gibt auch eine Warnung, wenn Sie die Run/Debug-Konfiguration öffnen.

1
Huupke

Ich weiß, dass dies möglicherweise nicht die "richtige" Art ist, eine Javafx-Anwendung zu starten, aber ich habe seit einiger Zeit mit diesem Problem zu kämpfen und habe eine Problemumgehung gefunden, bei der keine externen Verpackungsanwendungen erforderlich sind Plugin (was mit dem Schattenplugin kollidiert) etc ...

Die Lösung verwendet Utils4j, um jfxrt zur Laufzeit dynamisch zu laden. Sie können es nicht in eine Klasse laden, die javafx.application.Application erweitert. Führen Sie es in einer separaten Klasse aus und nennen Sie es beispielsweise 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.

    }
}

sie können Utils4j in Ihr Projekt aufnehmen (wenn Sie maven verwenden):

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

Ich benutze Maven und führe diesen 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 im Terminal aus (vielleicht ein kleiner Unterschied in Windows.). Dann wird maven jfxrt.jar installieren, dann können Sie es einfach als referenzieren 

<dependency>
  <groupId>com.Oracle.javafx</groupId>
  <artifactId>javafx</artifactId>
  <version>2.2</version>
</dependency> 
1
Ciel

Ich entwickle unter Linux eine einfache WebApp, ich habe den gleichen Fehler, ist aber wirklich leicht zu beheben (vorausgesetzt, Sie entwickeln sich auf der Kommandozeile wie ich).

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 $?
0
FarDarkMist

Ich hatte das Problem, die Klasse Pair von javafx nicht zu finden.

Es scheint, dass Vanilla Eclipse (ohne die Erweiterung e (fx) clipse) die in Java enthaltene JavaFX-Laufzeitdatei nicht durchsucht.

Ich habe meinem Eclipse-Projekt-Erstellungspfad diese externe JAR-Datei hinzugefügt (oder, wenn Sie sich in einer Debug-Konfiguration befinden, fügen Sie die externe JAR-Datei auf der Registerkarte JRE der Debug-Konfiguration hinzu):

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

(Ersetzen Sie Java_HOME durch Ihren jdk-Ordner)

Für mich war es in /installs/jdk1.8.0_211/jre/lib/ext/jfxrt.jar

0
thedrs

in der Eclipse-Umgebung: Fügen Sie jfxrt.jar zu Bundle-ClassPath in der Datei MANIFEST.MF hinzu.

Bundle-ClassPath: .,
jfxrt.jar
0
Rut.b

Wenn Sie Netbeans wie mich verwenden und zwei Versionen von JDK installiert haben, sollten Sie den Klassenpfad in die entsprechende Java-Installation in der Konfigurationsdatei ändern. Dies ist auch ein Fehler in Netbeans: Es gibt zwei Möglichkeiten, dies zu tun:
Starten Sie NetBeans mit --jdkhome, indem Sie Folgendes ausführen:

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

Oder legen Sie die Eigenschaft "netbeans_jdkhome" in /etc/netbeans.conf fest, z.

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