thread por open intellij how causado application java exception javafx noclassdeffounderror

por - javafx sdk 11.0 2



Excepción de JavaFX en el hilo "main" java.lang.NoClassDefFoundError: javafx/application/Application (7)

Estoy recibiendo este error

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

Cuando intento ejecutar mi archivo de clase, esta es la fuente

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

El archivo fxml contiene una gui simple.


Estoy desarrollando en Linux una aplicación web simple. Recibí el mismo error, pero es realmente fácil de solucionar (asumiendo que se está desarrollando en la línea de comandos como yo).

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


He trabajado en este mismo tema durante las últimas horas. Aunque no lo he visto escrito explícitamente, parece que DEBES utilizar una de las herramientas de empaquetado de JavaFX, que es una tarea Ant o el ejecutable javafxpackager. (Consulte http://docs.oracle.com/javafx/2/deployment/packaging.htm , sección 5.3.1). El IDE de NetBeans utiliza Ant para empaquetar el código. (Estoy usando IntelliJ)

Cuando utiliza uno de esos métodos de empaquetado, además de todo el código y los recursos de su aplicación, también agrega lo siguiente a su archivo JAR de salida:

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

Con estos en su lugar, puede ejecutar la aplicación desde la línea de comandos:

java -jar outjar.jar

y todo funciona bien. Si elimino los archivos extra com.javafx.main, la aplicación no se ejecuta.

Para verificar esto, miré los cuatro archivos JAR en las muestras de JavaFX (BrickBreaker, Ensemble, FXML-LoginDemo y SwingInterop). Todos ellos tienen los archivos "extra", también.

Para mi aplicación de prueba pequeña, usé esta línea de comandos para construir un archivo JAR "ejecutable":

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

¡Espero que esto ayude!


IntelliJ y quizás otros IDE no refactorizan su configuración de Ejecutar / Depurar. Debe cambiar manualmente el nombre de su paquete antes del nombre de su clase principal. Por ejemplo, cambie ''sample.Main'' a ''com.company.package.ui.Main'' para que se inicie correctamente la próxima vez que intente ejecutarlo. Es posible que el IDE ya haya marcado el botón Ejecutar / Depurar con una cruz roja porque no pudo encontrar la clase principal. También da una advertencia cuando abre la configuración Ejecutar / Depurar.


Sé que puede que no sea la forma "correcta" de lanzar una aplicación javafx, pero he luchado con este problema durante algún tiempo y se me ocurrió una solución que no requiere el uso de aplicaciones de empaquetado externo, lo obligo a usar hormigas o expertos. plugin (que entra en conflicto con el plugin de sombra) etc ...

La solución utiliza Utils4j para cargar jfxrt dinámicamente en tiempo de ejecución. No puede cargarlo en una clase que extienda javafx.application.Application, hágalo en una clase separada y asígnele un nombre, por ejemplo: 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. } }

puede incluir Utils4j con su proyecto (si usa maven):

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


Si está utilizando netbeans como yo y tiene dos versiones de JDK instaladas, debe cambiar el classpath a la instalación java adecuada en el archivo de configuración. Esto también es un error en Netbeans: hay dos formas de hacerlo:
O inicie NetBeans con --jdkhome ejecutando esto:

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

O establezca la propiedad "netbeans_jdkhome" en /etc/netbeans.conf, por ejemplo

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


Usar java 8 no debería dar este problema pero lo hizo por mí

Creé mi jarra inicialmente desde Eclipse Export -> Runnable Jar y estaba bien. Cuando me mudé a Maven falló con lo anterior.

La comparación de los dos frascos mostró que no se empaquetó nada relacionado con fx con el frasco (como es de esperar), pero que el manifiesto generado por Eclipse tenía Class-Path: . en eso. Conseguir que maven empaquetara el frasco con lo siguiente me funcionó (con 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>


Uso maven y acabo de ejecutar 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 en terminal (Tal vez una pequeña diferencia en Windows.). Luego, jfxrt.jar instalará jfxrt.jar entonces simplemente puede hacer referencia a él como

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