JavaFX application fail to launch with native exe

2020-04-20 07:01发布

问题:

I have build a JavaFX application which can be executed by its jar file. However if i try to run it using the native exe bundle i am receiving two popups:

  • com/npap/dicomrouter/Main - no main class

  • failed to launch JVM

and the application fails to start.

This is my Main class (most of its part):

package com.npap.dicomrouter;

public class Main extends Application {
    ...
    public static void main(String[] args) throws IOException {

        try {
            JUnique.acquireLock(appId);
            alreadyRunning = false;
            log.info("application is going to start running!!!!");
        } catch (AlreadyLockedException e) {
            alreadyRunning = true;
            log.info("application is already running!!!!");
        }

        if (!alreadyRunning) {
            Application.launch(Main.class, (java.lang
            .String[])null);
        }


    }

    @Override
    public void start(Stage primaryStage) throws IOException {
        ...
        try {
            AnchorPane page = (AnchorPane) FXMLLoader.load(Main.class.getResource("FXMLDocument.fxml"));
            Scene scene = new Scene(page, initWidth, initHeight);
            primaryStage.setScene(scene);
            Platform.setImplicitExit(false);
            createTrayIcon(primaryStage);
            primaryStage.setTitle(appTitle);
            primaryStage.show();
        } catch (IOException ex) {
            log.log(Level.INFO, null, ex);            
        }
    }

My build.xml is configured this way:

<target name="-post-jfx-deploy">
    <fx:deploy width="${javafx.run.width}" height="${javafx.run.height}" 
              nativeBundles="all"
              outdir="${basedir}/${dist.dir}" outfile="${application.title}">
      <fx:application name="${application.title}" 
                      mainClass="${javafx.main.class}"/>
      <fx:resources>
          <fx:fileset dir="${basedir}/${dist.dir}"
                      includes="*.jar"/>
      </fx:resources>
      <fx:info title="${application.title}" 
               vendor="${application.vendor}"/>
    </fx:deploy>          
</target>

I am building the application (Java FX 2.1) using Netbeans, in the way described here:

https://netbeans.org/kb/docs/java/native_pkg.html

and i have succesfully build and run other javafx applications with native exe bundle. I am also attaching a screenshot showing how i declare the main project's class.

So i profoundly assume that this is a project specific issue. During the build in the console i get:

The jar lib\hibernate-commons-annotations-4.0.2.Final.jar has a main class org.hibernate.annotations.common.Version that does not match the declared main com.xxxx.yyyy.Main
The jar lib\javassist-3.15.0-GA.jar has a main class javassist.CtClass that does not match the declared main com.xxxx.yyyy.Main
The jar lib\h2-1.3.176.jar has a main class org.h2.tools.Console that does not match the declared main com.xxxx.yyyy.Main

Apart from these jars, i use several other classes which contain "main" methods (are runnable).

@SuppressWarnings("unchecked")
public static void main(String args[]) throws Exception {
    ...

Most of them are 3-rd party utility classes.

I am also adding the contents of package.cfg file just FYI:

app.mainjar=DicomRouterAffidea0_2_2.jar
app.version=1.0
app.id=com.npap.dicomrouter
app.preferences.id=com/npap/dicomrouter
app.mainclass=com/npap/dicomrouter/Main
app.classpath=lib/antlr-2.7.7.jar lib/c3p0-0.9.2.1.jar lib/clibwrapper_jiio.jar .....
... //jars listing

Finally i am attaching 3 screenshots of Libraries, Compiling and Deployment Netbeans configuration. Hope that can also help:

回答1:

Just answering my question since after some trials i managed to build a functional .exe file by removing the code from build.xml.

So i removed all these lines from build.xml:

<target name="-post-jfx-deploy">
<fx:deploy width="${javafx.run.width}" height="${javafx.run.height}" 
          nativeBundles="all"
          outdir="${basedir}/${dist.dir}" outfile="${application.title}">
  <fx:application name="${application.title}" 
                  mainClass="${javafx.main.class}"/>
  <fx:resources>
      <fx:fileset dir="${basedir}/${dist.dir}"
                  includes="*.jar"/>
  </fx:resources>
  <fx:info title="${application.title}" 
           vendor="${application.vendor}"/>
</fx:deploy>          

and i am just importing:

<import file="nbproject/build-impl.xml"/>