JavaFX并使用Ant

时间:2015-04-27 06:32:15

标签: ant javafx

我跟随oracle的教程,在编译代码后尝试运行jar文件输出时收到此错误消息。

Error: Could not find or load main class HelloWorld

为了设置一个java开发环境,我去了oracle并下载了他们的Java SE Development Kit并将其放入/usr/lib/jvm/jdk1.8.0_45,然后按照指示在build.xml文件中指向它。

在本教程中,我有一个包含以下代码/脚本的项目文件夹:

(实施例/ 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);
    }
}

(实施例/ 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>

这里有一些非常简单的调试信息可能会暴露问题:

$ 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

缺少什么?

1 个答案:

答案 0 :(得分:3)

我有一个针对我的Javafx应用程序的工作ant构建(它的2.2,但它可能适合你),应用程序在win和linux上进行测试。
这些是关键的区别:

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

此外,当我检查清单文件时,我看到类似这样的内容:

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

这些是自动添加的,我没有Main-Class和Class-Path。