2015-04-27 10 views
9

Ich bin zusammen mit dem Lernprogramm um oracle und bekomme diese Fehlermeldung, wenn ich versuche, die JAR-Datei Ausgabe nach dem kompilierten Code auszuführen.JavaFX und Kompilieren der HelloWorld mit Ant

Error: Could not find or load main class HelloWorld 

Zur Einrichtung einer Java-Entwicklungsumgebung, ging ich zum Orakel und heruntergeladen ihre Java SE Development Kit und ließ ihn in /usr/lib/jvm/jdk1.8.0_45 und zeigte dann in der Datei build.xml, um es wie angegeben wurde.

Im folgenden das Tutorial habe ich einen Projektordner mit dem folgenden Code/script:

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

(Beispiel/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> 

Hier einige sehr leicht Informationen zur Fehlersuche, die das Problem aussetzen kann:

$ 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 

Was fehlt?

+1

Ich habe es gerade versucht. Funktioniert ohne Probleme auf Win7. Können Sie den gesamten Inhalt des Beispielordners komprimieren und in das Internet stellen? – Roland

+0

Danke für diesen Einblick. Könnten Sie 'echo% CLASSPATH%' auf Ihrem System ausführen und die Ausgabe teilen? Mein Klassenpfad ist nicht gesetzt, was bedeuten kann, dass ich ihn stattdessen in build.xml setzen muss (oder versuche mit der Variablen zu spielen, um zu sehen, ob es hilft) – Ninjaxor

+0

Das gesamte Code-Projekt ist hier verfügbar https://github.com/thenotary/ halloJavafx – Ninjaxor

Antwort

4

Die Meldung "Die Hauptklasse HelloWorld konnte nicht gefunden oder geladen werden" bedeutet, dass Java die Klasse HelloWorld in ihrem Klassenpfad nicht finden konnte. Ich vermute, dass dies auf die Class-Path Eintrag zurückzuführen sein kann, in der Manifest-Datei leer ist:

Class-Path: 

Sie können das Überschreiben dieser Eintrag versuchen wollen, indem Sie folgende in der Ant Buildfile Classpath an die Wurzel des Jar zu setzen (dies ist ähnlich dem Beispiel 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

Danke für die Antwort! Ich denke, Sie sind an etwas dran, aber das Manifest der .JAR-Ausgabe ist immer noch leer für mich = ( – Ninjaxor

3

ich habe eine Arbeits ant Build für meine JavaFX-Anwendung (es ist 2.2, aber es könnte für Sie arbeiten), die Anwendung auf Win und linux getestet.
Dies sind die wichtigsten Unterschiede:

<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"/> 

Außerdem, wenn ich die Manifest-Datei zu überprüfen, ich so etwas wie dies sehen:

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

Diese werden automatisch hinzugefügt und ich habe keine Main-Klasse und Klassenpfad

Verwandte Themen