2015-04-27 15 views
9

Tôi đang làm theo hướng dẫn tại oracle và tôi nhận được thông báo lỗi này khi tôi cố gắng chạy đầu ra tệp jar sau khi mã được biên dịch.JavaFX và biên dịch HelloWorld với Ant

Error: Could not find or load main class HelloWorld 

Để thiết lập một môi trường phát triển java, tôi đã đến oracle và tải Java SE Development Kit của họ và bỏ nó vào /usr/lib/jvm/jdk1.8.0_45 và sau đó chỉ vào nó trong file build.xml như đã được chỉ định.

Trong sau hướng dẫn này, tôi có một thư mục dự án với mã/script sau:

(ví dụ/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); 
    } 
} 

(ví dụ/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> 

Dưới đây là một số thông tin gỡ lỗi rất nhẹ có khả năng gây các vấn đề:

$ 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 

Điều gì còn thiếu?

+1

Tôi vừa thử nó. Hoạt động không có vấn đề gì trên Win7. Bạn có thể nén toàn bộ nội dung của thư mục mẫu và đưa nó lên web không? – Roland

+0

Cảm ơn thông tin chi tiết đó. Bạn có thể chạy 'echo% CLASSPATH%' trên hệ thống của bạn và chia sẻ đầu ra không? Classpath của tôi không được thiết lập có thể có nghĩa là tôi cần phải đặt nó trong build.xml thay vào đó (hoặc thử chơi với biến để xem nó có giúp ích không) – Ninjaxor

+0

Toàn bộ dự án mã có sẵn tại đây https://github.com/thenotary/ helloJavafx – Ninjaxor

Trả lời

4

Thông báo "Không tìm thấy hoặc tải lớp chính HelloWorld" có nghĩa là Java không thể tìm thấy lớp HelloWorld trong đường dẫn lớp của nó. Tôi nghi ngờ điều này có thể là do sự xâm nhập Class-Path là trống rỗng trong file manifest:

Class-Path: 

Bạn có thể muốn thử trọng cụm từ này để thiết lập classpath vào thư mục gốc của Jar bằng cách thêm vào sau trong buildfile Ant (điều này cũng tương tự như ví dụ trong 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

Cảm ơn bạn đã phản hồi! Tôi nghĩ rằng bạn đang ở trên một cái gì đó, nhưng biểu hiện đầu ra .JAR vẫn còn trống cho tôi = ( – Ninjaxor

3

tôi có một tác kiến ​​xây dựng cho các ứng dụng JavaFX của tôi (đó là 2.2, nhưng nó có thể làm việc cho bạn), ứng dụng được thử nghiệm trên chiến thắng và linux.
Đây là những khác biệt quan trọng:

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

Hơn nữa khi tôi kiểm tra các file manifest, tôi thấy một cái gì đó như thế này:

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

Những được tự động thêm và tôi không có Main-Class và Class-Path.

Các vấn đề liên quan