2015-04-27 11 views
9

Seguo il tutorial su oracle e ricevo questo messaggio di errore quando tento di eseguire l'output del file jar dopo che il codice è stato compilato.JavaFX e compilazione di HelloWorld con Ant

Error: Could not find or load main class HelloWorld 

Per configurare un ambiente di sviluppo Java, sono andato a Oracle e scaricato la loro Java SE Development Kit e la lasciò cadere in /usr/lib/jvm/jdk1.8.0_45 e poi indicò nel file build.xml come è stato indicato.

Seguendo il tutorial, ho una cartella di progetto con il seguente codice/script:

(es/src/HelloWorld.java)

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class HelloWorld extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
public static void main(String[] args) { 
     launch(args); 
    } 
} 

(es/build.xml)

<?xml version="1.0" encoding="UTF-8" ?> 

<project name="JavaFX Hello World Example" default="default" basedir="." 
    xmlns:fx="javafx:com.sun.javafx.tools.ant"> 

    <property name="JAVA_HOME" value="/usr/lib/jvm/jdk1.8.0_45"/> 
    <property name="build.src.dir" value="src"/> 
    <property name="build.classes.dir" value="classes"/> 
    <property name="build.dist.dir" value="dist"/> 

    <target name="default" depends="clean,compile"> 

    <taskdef resource="com/sun/javafx/tools/ant/antlib.xml" 
     uri="javafx:com.sun.javafx.tools.ant" 
     classpath="${JAVA_HOME}/lib/ant-javafx.jar"/> 

     <fx:application id="HelloWorldID" 
     name="JavaFXHelloWorldApp" 
     mainClass="HelloWorld"/> 

     <fx:resources id="appRes"> 
     <fx:fileset dir="${build.dist.dir}" includes="HelloWorld.jar"/> 
     </fx:resources> 

     <fx:jar destfile="${build.dist.dir}/HelloWorld.jar"> 
     <fx:application refid="HelloWorldID"/> 
     <fx:resources refid="appRes"/> 
     <fileset dir="${build.classes.dir}"/> 
     </fx:jar> 

     <fx:deploy width="300" height="250" 
     outdir="." embedJNLP="true" 
     outfile="helloworld"> 

     <fx:application refId="HelloWorldID"/> 

     <fx:resources refid="appRes"/> 

     <fx:info title="JavaFX Hello World Application" 
      vendor="Oracle Corporation"/> 

     </fx:deploy> 

    </target> 

    <target name="clean"> 
    <mkdir dir="${build.classes.dir}"/> 
    <mkdir dir="${build.dist.dir}"/> 

    <delete> 
     <fileset dir="${build.classes.dir}" includes="**/*"/> 
     <fileset dir="${build.dist.dir}" includes="**/*"/> 
    </delete> 

    </target> 

    <target name="compile" depends="clean"> 

    <javac includeantruntime="false" 
     srcdir="${build.src.dir}" 
     destdir="${build.classes.dir}" 
     fork="yes" 
     executable="${JAVA_HOME}/bin/javac" 
     source="1.8" 
     debug="on"> 
    </javac> 
    </target> 

</project> 

Ecco alcuni molto leggera informazioni di debug che possono esporre il problema:

$ java -jar HelloWorld.jar 
Error: Could not find or load main class HelloWorld 


$ jar tvf HelloWorld.jar 
    0 Mon Apr 27 00:57:58 CDT 2015 META-INF/ 
    113 Mon Apr 27 00:57:58 CDT 2015 META-INF/MANIFEST.MF 
    1014 Mon Apr 27 00:57:58 CDT 2015 HelloWorld$1.class 
    1436 Mon Apr 27 00:57:58 CDT 2015 HelloWorld.class 




(HwlloWorld.jar META-INF/MANIFEST.MF) 
Manifest-Version: 1.0 
JavaFX-Version: 8.0 
Class-Path: 
Created-By: JavaFX Packager 
Main-Class: HelloWorld 

Cosa manca?

+1

Ho appena provato. Funziona senza problemi su Win7. Puoi comprimere l'intero contenuto della cartella di esempio e metterlo sul web? – Roland

+0

Grazie per l'intuizione. Potresti eseguire 'echo% CLASSPATH%' sul tuo sistema e condividere l'output? Il mio classpath non è impostato, il che significa che ho bisogno di impostarlo in build.xml (o provare a giocare con la variabile per vedere se aiuta) – Ninjaxor

+0

L'intero progetto di codice è disponibile qui https://github.com/thenotary/ ciao javafx – Ninjaxor

risposta

4

Il messaggio "Impossibile trovare o caricare la classe principale HelloWorld" significa che Java non è stato in grado di trovare la classe HelloWorld nel suo percorso di classe. Ho il sospetto che questo può essere dovuto alla voce Class-Path essere vuoti nel file manifesto:

Class-Path: 

Si consiglia di provare l'override questa voce per impostare il percorso di classe alla radice del vaso con l'aggiunta di quanto segue nella BuildFile Ant (questo è simile all'esempio in this link):

<fx:jar destfile="${build.dist.dir}/HelloWorld.jar"> 
    <fx:application refid="HelloWorldID"/> 
    <fx:resources refid="appRes"/> 
    <fileset dir="${build.classes.dir}"/> 

    <manifest> 
     <attribute name="Class-Path" value="."/> 
    </manifest> 
</fx:jar> 
+0

Grazie per la risposta! Penso che tu sia su qualcosa, ma il manifest di output .JAR è ancora in bianco per me = ( – Ninjaxor

3

ho un accumulo formica lavora per la mia applicazione JavaFX (è 2,2, ma potrebbe funzionare per voi), l'applicazione è testato su vittoria e Linux.
Queste sono le differenze principali:

<path id="fxant"> 
    <filelist> 
     <file name="${java.home}\..\lib\ant-javafx.jar"/> 
     <file name="${java.home}\lib\jfxrt.jar"/> 
    </filelist> 
</path> 

<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"  
    uri="javafx:com.sun.javafx.tools.ant" 
    classpathref="fxant"/> 

Inoltre quando controllo il file manifesto, vedo qualcosa di simile:

JavaFX-Application-Class: packagename.MainClass 
JavaFX-Class-Path: packagename/MainClass.class 

Questi vengono aggiunti automaticamente e non ho Main-Class e Class-Path.