2012-06-04 11 views
12

Próbuję bardzo proste użycie JavaFX za pomocą prostego zestawu linii kodu, które dostałem od innej strony stackoverflow (here). Ale problem nie jest wyraźnie związany z tym kodem, ale z czymś bardziej podstawowym w procesie budowania i uruchamiania.Kompilowanie i uruchamianie z JavaFX 2.1

Oto mój kod:

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

Na początku nie mogłem tego skompilować w ogóle. W końcu zorientowałem się, że muszę umieścić w wierszu poleceń javac -classpath c: \ Program Files \ Oracle \ JavaFX 2.1 SDK \ lib \ rt \ jfxrt.jar. (Jednym z oczywistych pytań jest tutaj: Dlaczego nie jest to udokumentowane w żadnym oczywistym miejscu (1), że jest to potrzebne i (2) jak dokładnie obliczyć ścieżkę do instalacji JavaFX ?!)

Ale po uruchomieniu kodu otrzymuję:

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 

Co to oznacza? Wygląda na to, że w czasie wykonywania nie wie, jak znaleźć klasę javafx.scene.media.Media. Jednak moja zmienna% CLASSPATH% ma zdecydowanie "c: \ Program Files \ Oracle \ JavaFX 2.1 SDK \ lib \ rt \ jfxrt.jar".

Wszelkie pomysły? Z góry dziękuję!

+0

Chyba masz coś nie tak z konfiguracją. Nie powinno być konieczne ręczne umieszczanie słoików JavaFX w ścieżce klas. W jaki sposób budujesz i uruchamiasz aplikację JavaFX? Ze skryptami ant dostarczonymi przez NetBeans? – Puce

+0

Nie, nie używam NetBeans, ale pracuję bezpośrednio z konsoli. Moja linia javac to: "javac -classpath" c: \ Program Files \ Oracle \ JavaFX 2.1 SDK \ rt \ lib \ jfxrt.jar "; .. \ bin -d .. \ bin .. \ src \ progtext.java" –

Odpowiedz

9

To pytanie w pewnym stopniu powiela się compile javafx 2.0 manually.

Ta odpowiedź jest przeznaczona specjalnie dla wersji JavaFX 2 przed wydaniem Oracle Java 8. W środowisku Oracle JavaFX 8+ środowisko wykonawcze JavaFX znajduje się w ścieżce klasy, więc nie trzeba go dodawać jawnie podczas kompilowania lub uruchamiania JavaFX Aplikacje.

Java zawiera JavaFX w jdk7u6 i nowszych wersjach (dla systemów Windows i Linux) oraz jdk7u4 i nowszych (dla OSX).

Pobierz i używaj jdk7u6 + i nie będziesz musiał określać pliku jfxrt.jar w żadnej ścieżce klas, a wszystkie problemy związane z klasą klatek w JavaFX powinny zniknąć.

Oto link do early binary build of jdk7u6.

Dla JavaFX 2.1 w systemie Windows należy dodać bibliotekę jfxrt.jar do ścieżki klas w celu kompilacji (NetBeans zrobi to automatycznie, jeśli użyjesz jej ustawień platformy JavaFX) i (jeśli nie spakujesz poprawnie swojej aplikacji zadania javafxpackager lub JavaFX ant), również w środowisku wykonawczym.

JavaFX 2.1 dla systemu Linux jest wersją wstępną (w przypadku, gdy używasz tego). W przypadku przedpremierowego systemu Linux wystarczy włączyć plik jfxrt.jar w ścieżce klas zarówno w czasie kompilowania, jak i środowiska wykonawczego, jeśli środowisko wykonawcze JavaFX w systemie Linux nie zostało poprawnie skonfigurowane.

Oto przykład kompilacji z wiersza poleceń i wykonania programu JavaFX w systemie Windows.

Uruchom edytor:

C:\dev\test>notepad HelloWorld.java 

Wklej następujący kod i zapisz go:

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

skompilować i uruchomić go 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 

dla Oracle Java 8+, wyraźne JavaFX classpath specifier nie jest wymagane:

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

Należy pamiętać, że zwykle zamiast po prostu kompilacji kodu i uruchomienie go, byś także pakiecie kod za pomocą javafxpackager lub zadań mrówek javafx. Zadania te osadzą klasę programu uruchamiającego w aplikacji pakietu, która wykryje wersję i lokalizację środowiska wykonawczego JavaFX, dzięki czemu nie będzie konieczne określanie lokalizacji jfxrt.jar, chyba że chcesz zastąpić domyślną lokalizację platformy.

+0

Dziękuję bardzo dużo jewelsea. To jest bardzo pomocne. Zanim spróbuję zainstalować jdk7u6, chciałbym zobaczyć, co jest potrzebne, aby mój kod mógł działać z jdk7u4, który już mam. Jak mogę uruchomić program, tak jak teraz? Czy masz jakies pomysły? –

+0

Mała korekcja: nawet w przypadku wstępnej wersji JavaFX 2.1 dla systemu Linux, jfxrt.jar nie jest potrzebny w ścieżce klas, jeśli jest skonfigurowany prawidłowo. – Puce

+0

Dzięki Puce, zaktualizowałem odpowiedź, aby uwzględnić Twoją korektę. – jewelsea

-4

Dla aktualizacji Java 7 21, Windows XP SP3, użyłem

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

i

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

-1 Na ​​co odpowiadasz? Nie wspominasz o problemie w Q. – fredrik