2013-06-01 36 views
13

sto ricevendo questo erroreJavaFX Eccezione in filetto java.lang.NoClassDefFoundError "principale": JavaFX/applicazione/Application

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 

Quando si tenta di eseguire il mio file di classe, questa è la fonte

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

Il file fxml contiene una semplice interfaccia grafica.

+1

possibile duplicato del [javac di jdk1.7 non riesce a trovare vaso JavaFX senza opzione -cp] (http://stackoverflow.com/questions/16849992/jdk1-7s-javac-cant-find-javafx-jar-senza-cp-option) – jewelsea

+0

Ho dichiarato il mio classpath alla directory di jfxrt.jar e sto ricevendo questo errore ora: 'Errore: Potrebbe non trovare o caricare la classe principale – Archey

+1

È necessario avere la directory corrente su classpath => per i dettagli vedere: [Compilazione manuale di JavaFX 2.0] (http://stackoverflow.com/questions/9436219/compile-javafx-2-0 -manuale) – jewelsea

risposta

0

Sto sviluppando su Linux una semplice WebApp. Ho ottenuto lo stesso errore, ma è davvero facile risolverlo (presumendo che tu stia sviluppando sulla riga di comando come me stesso).

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

Ho lavorato su questo stesso problema nelle ultime ore. Anche se non l'ho visto scritto in modo esplicito, sembra che tu DEVE utilizzare uno degli strumenti di pacchettizzazione JavaFX, che è un'attività Ant o l'eseguibile javafxpackager. (Vedere http://docs.oracle.com/javafx/2/deployment/packaging.htm, sezione 5.3.1). L'IDE NetBeans utilizza Ant per impacchettare il codice. (Sto usando IntelliJ)

Quando si utilizza uno di questi metodi di confezionamento, oltre a tutti i codici e le risorse della vostra applicazione, si aggiunge anche il seguente per l'output file JAR:

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

Con questi al posto, è possibile eseguire l'applicazione dalla riga di comando:

java -jar outjar.jar 

e tutto funziona correttamente. Se rimuovo i file extra com.javafx.main, l'app non viene eseguita.

Per ricontrollare ciò, ho esaminato tutti e quattro i file JAR negli esempi JavaFX (BrickBreaker, Ensemble, FXML-LoginDemo e SwingInterop). Hanno tutti anche i file "extra".

Per la mia piccola applicazione di prova, ho usato questa riga di comando per costruire un "eseguibile" file JAR:

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

Spero che questo aiuti!

+0

Puoi mostrare come viene generato MANIFEST.MF? – Math

+0

Sto usando Intellij e ho avuto questo problema. Ma ho visto che usa formica da costruire e javafxpacker da distribuire. Ancora non ha questa classe di fallback. Sei sicuro che non ci sia soluzione per questo da Intellij? – gadelkareem

+0

Questo messaggio di errore viene visualizzato anche se Java 1.8 è installato e il punto CLASSPATH è javafx appositamente. Questo è accaduto al DbSchema 7.6.5 dove codificava il classpath per escludere javafx. Dopo aver modificato lo script della shell, questo problema è scomparso. –

1

So che potrebbe non essere il modo "corretto" di avviare un'applicazione javafx, ma ho faticato con questo problema per un po 'di tempo e ho trovato una soluzione che non richiede l'uso di applicazioni di packaging esterne, mi obbliga a usa il plugin ant o maven (che è in conflitto con il plugin ombra) ecc ...

La soluzione utilizza Utils4j per caricare dinamicamente jfxrt in fase di runtime. Non è possibile caricare in una classe che estende javafx.application.Application, farlo in una classe separata e il nome, ad esempio: 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. 

    } 
} 

è possibile includere Utils4j con il vostro progetto (se si utilizza Maven):

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

Io uso Maven e ho appena eseguito questo 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 nel terminale (Forse una piccola differenza in Windows.).Poi Maven installerà jfxrt.jar allora si può semplicemente riferimento come

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

Se si sta utilizzando NetBeans come me e si dispone di due versioni di JDK installato, allora si dovrebbe cambiare il classpath per l'installazione di Java appropriata nel file di configurazione . Questo è anche un bug in Netbeans: Ci sono due modi per farlo:
sia iniziare NetBeans con --jdkhome eseguendo questo:

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

o impostare il "netbeans_jdkhome" proprietà in/etc/NetBeans. conf eg

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

IntelliJ e forse altri IDE non rifattano la configurazione Esegui/Debug. È necessario modificare manualmente il nome del pacchetto prima del nome della classe Main. Ad esempio, cambia "sample.Main" in "com.company.package.ui.Main" in modo che venga avviato correttamente la prossima volta che provi ad eseguirlo. L'IDE potrebbe aver già contrassegnato il pulsante Esegui/Debug con una croce rossa perché non è stato possibile trovare la classe principale. Fornisce inoltre un avviso quando si apre la configurazione Esegui/Debug.

2

utilizzando Java 8 non dovrebbe dare a questo problema, ma lo ha fatto per me

ho creato il mio vaso inizialmente da Eclipse Export -> Jar Runnable e andava bene. Quando mi sono trasferito a Maven ha fallito con quanto sopra.

Il confronto tra i due vasi ha mostrato che nulla correlato a fx è stato confezionato con il barattolo (come mi sarei aspettato) ma che il manifest di Eclipse aveva Class-Path: . in esso. Ottenere Maven per confezionare il vaso con le seguenti ha lavorato per me (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> 
Problemi correlati