2013-06-01 46 views
13

我得到這個錯誤JavaFX的例外在線程「主要」 java.lang.NoClassDefFoundError:JavaFX的/應用/應用

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 

當試圖運行我的類文件,這是源

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

fxml文件包含一個簡單的gui。

+1

可能重複[jdk1.7的javac找不到沒有-cp選項的JavaFX的jar(http://stackoverflow.com/questions/16849992/jdk1-7s-javac -cant-find-javafx-jar-without-cp-option) – jewelsea

+0

我把我的classpath聲明爲jfxrt.jar的目錄,現在我得到這個錯誤:'Error:Could找不到或加載主類「 – Archey

+1

你需要在classpath =>上有你的當前目錄以獲取詳細信息,請參閱:[手動編譯JavaFX 2.0](http://stackoverflow.com/questions/9436219/compile-javafx-2-0 - 手動) – jewelsea

回答

0

我正在Linux上開發一個簡單的WebApp,我得到了同樣的錯誤,但真的很容易解決它(假設你正在開發自己的命令行)。

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

我在過去的幾個小時裏一直在處理這個相同的問題。儘管我沒有看到它明確寫入,但看起來您使用的是其中一種JavaFX打包工具,它可以是Ant任務,也可以是javafxpackager可執行文件。 (見http://docs.oracle.com/javafx/2/deployment/packaging.htm,第5.3.1節)。 NetBeans IDE使用Ant來打包代碼。 (我使用的IntelliJ)

當您使用的這些包裝方法之一,除了所有的應用程序代碼和資源,還增加了以下到您的輸出JAR文件:

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

隨着這些到位,你可以從命令行運行的應用程序:

java -jar outjar.jar 

和所有正常工作。如果我刪除多餘的com.javafx.main文件,該應用程序不會運行。

爲了仔細檢查,我查看了JavaFX示例(BrickBreaker,Ensemble,FXML-LoginDemo和SwingInterop)中的所有四個JAR文件。他們都有「額外」文件。

對於我的小測試應用程序,我用這個命令行建立一個「可執行」的JAR文件:

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

希望這有助於!

+0

你能展示MANIFEST.MF是如何生成的? – Math

+0

我正在使用Intellij,我遇到了這個問題。但我看到它使用ant來構建和javafxpacker來部署。仍然沒有這個後備課。你確定在Intellij內沒有解決方法嗎? – gadelkareem

+0

即使您安裝了Java 1.8並且有意將CLASSPATH指向javafx,您也會看到此錯誤消息。這發生在DbSchema 7.6.5中,它將classpath硬編碼爲排除javafx。編輯完shell腳本後,這個問題就消失了。 –

1

我知道它可能不是啓動javafx應用程序的「正確」方式,但我一直在努力解決這個問題一段時間,並提出了一種不需要使用任何外部打包應用程序的解決方法,迫使您使用ant或maven插件(與陰影插件衝突)等...

解決方案使用Utils4j在運行時動態加載jfxrt。你可以不加載它在擴展javafx.application.Application類,做一個單獨的類,並將其命名,例如:啓動

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. 

    } 
} 

您可以向您的項目Utils4j(如果使用maven):

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

我使用maven,我只是在終端運行這個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(也許在Windows中有點不同)。然後Maven將安裝jfxrt.jar那麼你可以直接引用它作爲

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

如果您使用的是像我NetBeans和您安裝JDK的兩個版本,那麼你應該改變類路徑,以適當的Java安裝在配置文件。這也是在Netbeans的一個bug: 有兩種方法可以做到這一點:
要麼通過執行此開始--jdkhome的NetBeans:

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

或者在/ etc/NetBeans中的「netbeans_jdkhome」屬性。 conf例如

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

IntelliJ和其他IDE不會重構您的運行/調試配置。您必須手動更改您的Main類名稱之前的包名稱。例如,將'sample.Main'更改爲'com.company.package.ui.Main',以便在下次嘗試運行它時正確啓動。 IDE可能已經用紅叉標記了Run/Debug按鈕,因爲它找不到主類。它還會在打開運行/調試配置時發出警告。

2

用java 8不該放棄這個問題,但它確實對我來說

我創造了我最初罐子從Eclipse導出 - >運行的JAR,這是罰款。當我搬到Maven時,它失敗了。

比較兩個罐子顯示沒有任何fx相關的東西與罐子打包在一起(正如我所料),但Eclipse生成的清單中有Class-Path: .。獲得行家包裝與以下工作對我來說(與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> 
相關問題