2012-06-04 8 views
12

Estoy intentando hacer un uso muy simple de JavaFX usando un conjunto simple de líneas de código que obtuve de otra página de stackoverflow (here). Pero, el problema no es claramente con ese código, sino con algo más fundamental en el proceso de compilación y ejecución.Compilación y ejecución con JavaFX 2.1

Aquí está mi código:

import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
. 
. 
. 
Media medMsg = new Media("msg.mp3"); 
MediaPlayer medplMsg = new MediaPlayer(medMsg); 
medplMsg.play(); 

Al principio no pude conseguir que esto compilar en absoluto. Eventualmente me di cuenta de que necesitaba poner -classpath c: \ Program Files \ Oracle \ JavaFX 2.1 SDK \ lib \ rt \ jfxrt.jar en mi línea de comando javac. (Un complejo de preguntas obvio aquí es: ¿Por qué no está documentado en ningún lugar obvio (1) que esto es necesario y (2) cómo averiguar exactamente cuál es la ruta de la instalación JavaFX ?!)

Pero, cuando ejecuto el código, obtengo:

Exception in thread "main" java.lang.NoClassDefFoundError: javafx/scene/media/Media 

    at progtest.main(progtest.java:120) 
Caused by: java.lang.ClassNotFoundException: javafx.scene.media.Media 
    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) 
    ... 1 more 

¿Qué significa esto? Parece que no sabe, en tiempo de ejecución, cómo encontrar la clase javafx.scene.media.Media. Pero mi variable% CLASSPATH% definitivamente tiene "c: \ Archivos de programa \ Oracle \ JavaFX 2.1 SDK \ lib \ rt \ jfxrt.jar" en ella.

¿Alguna idea? ¡Gracias de antemano!

+0

yo creo que hay algo mal con su configuración. No debería ser necesario poner ningún jarrón JavaFX manualmente en el classpath. ¿Cómo construyes y ejecutas tu aplicación JavaFX? Con los scripts de hormiga proporcionados por NetBeans? – Puce

+0

No, no estoy usando NetBeans pero trabajando directamente desde la consola. Mi línea javac es: 'javac-classpath' c: \ Archivos de programa \ Oracle \ JavaFX 2.1 SDK \ rt \ lib \ jfxrt.jar "; .. \ bin -d .. \ bin .. \ src \ progtext.java ' –

Respuesta

9

Esta pregunta duplica un poco compile javafx 2.0 manually.

Esta respuesta es específica para las versiones de JavaFX 2 antes del lanzamiento de Oracle Java 8. Para Oracle JavaFX 8+, el tiempo de ejecución de JavaFX está en classpath, por lo que no necesita agregarlo explícitamente al compilar o ejecutar JavaFX aplicaciones.

Java incluye JavaFX en jdk7u6 y superior (para Windows y Linux) y jdk7u4 y superior (para OSX).

Descargue y use jdk7u6 + y no necesitará especificar el archivo jfxrt.jar en ningún classpath y todos sus problemas de classpath relacionados con JavaFX deberían desaparecer.

Aquí hay un enlace a un early binary build of jdk7u6.

Para JavaFX 2.1 en Windows, necesita incluir la lib jfxrt.jar en su classpath para la compilación (NetBeans lo hará automáticamente si usa su configuración de plataforma JavaFX) y (si no ha empaquetado su aplicación correctamente usando las tareas javafxpackager o JavaFX ant), también en tiempo de ejecución.

JavaFX 2.1 para Linux es una versión preliminar (en caso de que esté usando eso). Para el prelanzamiento de Linux, solo debería incluir jfxrt.jar en su classpath tanto en compilación como en tiempo de ejecución si el tiempo de ejecución de JavaFX en Linux no se configuró correctamente.

Aquí hay un ejemplo de una compilación de línea de comando y ejecución de un programa JavaFX bajo Windows.

lanzamiento de un editor:

C:\dev\test>notepad HelloWorld.java 

Pegue el código siguiente y guárdelo:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.stage.Stage; 

public class HelloWorld extends Application { 
    public static void main(String[] args) { 
    launch(args); 
    } 
    @Override 
    public void start(Stage stage) { 
    stage.setScene(new Scene(new Label("Hello World"))); 
    stage.show(); 
    } 
} 

compilarlo y ejecutarlo JavaFX 2.2:

C:\dev\test>javac -cp "\Program Files\Oracle\JavaFX 2.2 Runtime\lib\jfxrt.jar" HelloWorld.java 
C:\dev\test>java -cp ".;\Program Files\Oracle\JavaFX 2.2 Runtime\lib\jfxrt.jar" HelloWorld 

Para Oracle Java 8+, no se requiere la explícita especificador de ruta de clase JavaFX:

C:\dev\test>javac HelloWorld.java 
C:\dev\test>java HelloWorld 

Tenga en cuenta que por lo general en lugar de compilar el código y ejecutarlo, que sería también empaquetar el código con javafxpackager o las tareas javafx ant. Estas tareas incluirán una clase de iniciador en su aplicación empaquetada que detectará la versión y la ubicación del tiempo de ejecución JavaFX para que no necesite especificar la ubicación jfxrt.jar a menos que desee sobrescribir la ubicación predeterminada para la plataforma.

+0

Muchas gracias jewelsea. Esto es muy útil. Antes de intentar instalar jdk7u6, me gustaría ver qué es necesario para que mi código se ejecute con jdk7u4, que ya tengo. ¿Cómo hago que mi programa se ejecute como están las cosas ahora? ¿Tienes alguna idea? –

+0

Corrección pequeña: incluso para la versión preliminar de JavaFX 2.1 para Linux, jfxrt.jar no es necesario en la ruta de clases si está configurada correctamente. – Puce

+0

Gracias Puce, actualicé la respuesta para incluir su corrección. – jewelsea

-4

Para Java 7 actualización 21, Windows XP SP3, solía

javac -cp "\Program Files\Java\jre7\lib\jfxrt.jar" HelloWorld.java 

y

java -cp ".;\Program Files\Java\jre7\lib\jfxrt.jar" HelloWorld 
+0

-1 ¿A qué estás respondiendo? No hace referencia al problema en la Q. – fredrik

Cuestiones relacionadas