web-dev-qa-db-fra.com

Exception JavaFX dans le fil "principal" Java.lang.NoClassDefFoundError: javafx/application/Application

Je reçois cette erreur

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

En essayant d'exécuter mon fichier de classe, c'est la source

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

Le fichier fxml contient une interface graphique simple.

22
Archey

J'ai travaillé sur ce même problème depuis quelques heures. Même si je ne l'ai pas vu explicitement, il apparaît que vous DEVEZ utiliser l'un des outils de package JavaFX, à savoir une tâche Ant ou l'exécutable de javafxpackager. (Voir http://docs.Oracle.com/javafx/2/deployment/packaging.htm , section 5.3.1). NetBeans IDE utilise Ant pour conditionner le code. (J'utilise IntelliJ)

Lorsque vous utilisez l'une de ces méthodes de packaging, en plus de tout le code et des ressources de votre application, cela ajoute également ce qui suit dans votre fichier JAR de sortie:

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

Avec ceux-ci en place, vous pouvez exécuter l'application à partir de la ligne de commande:

Java -jar outjar.jar

et tout fonctionne bien. Si je supprime les fichiers supplémentaires com.javafx.main, l'application ne s'exécute pas.

Pour vérifier, j'ai examiné les quatre fichiers JAR des exemples JavaFX (BrickBreaker, Ensemble, FXML-LoginDemo et SwingInterop). Ils ont tous les fichiers "extra", aussi.

Pour ma petite application de test, j'ai utilisé cette ligne de commande pour créer un fichier JAR "exécutable":

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

J'espère que cela t'aides!

13
Rob Stoecklein

Utiliser Java 8 ne devrait pas poser ce problème, mais il l’a fait pour moi

J'ai initialement créé mon bocal à partir d'Eclipse Export -> Runnable Jar et c'était bien. Quand j'ai déménagé à Maven, cela a échoué. 

La comparaison des deux pots a montré que rien n’était lié au fx (comme je l’attendais), mais que le manifeste généré par Eclipse contenait Class-Path: .. Maven pour emballer le pot avec ce qui suit a fonctionné pour moi (avec 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 et peut-être d'autres IDE ne refactorisent pas votre configuration Run/Debug. Vous devez modifier manuellement le nom de votre paquet précédant le nom de votre classe Main. Par exemple, remplacez 'sample.Main' par 'com.company.package.ui.Main' pour qu'il se lance correctement lors de la prochaine exécution. Le IDE a peut-être déjà marqué le bouton Exécuter/Déboguer d'une croix rouge car il n'a pas pu trouver la classe principale. Il vous avertit également lorsque vous ouvrez la configuration Run/Debug.

1
Huupke

Je sais que ce n'est peut-être pas la manière "appropriée" de lancer une application javafx, mais cela fait un certain temps que je suis confronté à ce problème et que je propose une solution de contournement qui ne nécessite aucune application de packaging externe, vous oblige à utiliser ant ou maven plugin (qui entre en conflit avec le plugin shade) etc ...

La solution utilise Utils4j pour charger jfxrt de manière dynamique au moment de l'exécution. Vous ne pouvez pas le charger dans une classe d'extension javafx.application.Application, faites-le dans une classe séparée et nommez-le, par exemple: 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.

    }
}

vous pouvez inclure Utils4j dans votre projet (si vous utilisez maven):

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

J'utilise maven et je viens d'exécuter ce 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 dans un terminal (peut-être une petite différence dans Windows.) Ensuite, maven installera jfxrt.jar, vous pourrez simplement le référencer en tant que 

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

Je développe sous Linux une simple application Web, mais j'ai la même erreur, mais il est vraiment facile de la réparer (en supposant que vous développez en ligne de commande comme moi-même).

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

Si vous utilisez les netbeans comme moi et que vous avez installé deux versions de JDK, vous devez alors remplacer le chemin d'accès aux classes par l'installation Java appropriée dans le fichier de configuration. C'est aussi un bogue dans Netbeans: Il y a deux façons de le faire:
Soit démarrez NetBeans avec --jdkhome en exécutant ceci:

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

Ou définissez la propriété "netbeans_jdkhome" dans /etc/netbeans.conf, par exemple.

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