2012-06-04 60 views
12

我正在嘗試使用一組簡單的JavaFX使用一組簡單的代碼行,這是我從另一個計算器頁面(here)獲得的代碼行。但是,問題顯然不在於該代碼,而是在構建和運行過程中更重要。使用JavaFX 2.1編譯並運行

這裏是我的代碼:

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

起初,我不能讓這個在所有的編譯。最終我發現我需要在我的javac命令行上放置-classpath c:\ Program Files \ Oracle \ JavaFX 2.1 SDK \ lib \ rt \ jfxrt.jar。 (這裏有一個明顯複雜的問題是:爲什麼它沒有記錄在任何明顯的地方(1)是否需要以及(2)如何確切知道JavaFX安裝的路徑是什麼?!)

但是,當我運行我得到的代碼:

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 

這是什麼意思?它看起來像在運行時不知道如何找到類javafx.scene.media.Media。但是,我的%CLASSPATH%變量肯定有「c:\ Program Files \ Oracle \ JavaFX 2.1 SDK \ lib \ rt \ jfxrt.jar」。

任何想法?先謝謝你!

+0

我覺得你有什麼不對您的設置。不需要手動將任何JavaFX jar放在類路徑中。你如何構建和運行你的JavaFX應用程序?使用NetBeans提供的ant腳本? – Puce

+0

不,我沒有使用NetBeans,而是直接從控制檯工作。我的javac行是:'javac -classpath'c:\ Program Files \ Oracle \ JavaFX 2.1 SDK \ rt \ lib \ jfxrt.jar「; .. \ bin -d .. \ bin .. \ src \ progtext.java' –

回答

9

這個問題有些重複compile javafx 2.0 manually

此答案專門針對Oracle Java 8發佈前的JavaFX 2版本。對於Oracle JavaFX 8+,JavaFX運行時位於類路徑中,因此在編譯或JavaFX運行時無需顯式添加它應用。

Java在jdk7u6及更高版本(適用於Windows和Linux)以及jdk7u4及更高版本(適用於OSX)中包含JavaFX。

下載並使用jdk7u6 +,您不需要在任何類路徑中指定jfxrt.jar文件,並且所有與JavaFX相關的類路徑問題都應該消失。

這裏是一個鏈接到early binary build of jdk7u6

對於Windows上的JavaFX 2.1,您需要在您的類路徑中包含jfxrt.jar庫進行編譯(如果您使用它的JavaFX平臺設置,NetBeans會自動執行此操作)和(如果您尚未使用JavaFX平臺進行正確打包javafxpackager或JavaFX ant任務),也在運行時。

JavaFX 2.1 for Linux是一個預發行版(如果使用的話)。對於Linux預發佈版,如果Linux上的JavaFX運行時未正確設置,則只需將jfxrt.jar包含在編譯和運行時的classpath中。

這裏是一個命令行編譯和在Windows下執行JavaFX程序的例子。

啓動編輯:

C:\dev\test>notepad HelloWorld.java 

粘貼下面的代碼,並將其保存:

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

編譯並運行它的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 

對於Oracle的Java 8+,不需要明確的JavaFX的類路徑說明符:

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

平時注意而不僅僅是編譯代碼並運行它,你也會打包使用javafxpackager或javafx ant任務執行代碼。這些任務會將啓動器類嵌入到打包的應用程序中,該應用程序將檢測JavaFX運行時的版本和位置,以便您不需要指定jfxrt.jar位置,除非您想覆蓋平臺的默認位置。

+0

非常感謝jewelsea。這非常有幫助。在我嘗試安裝jdk7u6之前,我想看看讓我的代碼能夠使用jdk7u4來運行,而我已經擁有這些代碼。我如何讓我的程序像現在一樣運行?你有什麼想法? –

+0

小修正:即使對於Linux的JavaFX 2.1預發行版,如果安裝正確,jfxrt.jar在類路徑上也不需要。 – Puce

+0

感謝Puce,我更新了包含您的更正的答案。 – jewelsea

-4

對於Java 7更新21時,Windows XP SP3,我用

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

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

-1你在回答什麼?你沒有提到Q中的問題。 – fredrik