8169289: JavaFX application in named module fails to launch if no main method
authorddehaven
Mon, 07 Nov 2016 12:46:23 -0800
changeset 42178 cb5cb430e207
parent 42177 01491f2b7124
child 42179 f85b7ec33ca4
8169289: JavaFX application in named module fails to launch if no main method Reviewed-by: mchung, ksrini
jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java
--- a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java	Mon Nov 21 12:06:10 2016 -0800
+++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java	Mon Nov 07 12:46:23 2016 -0800
@@ -462,6 +462,8 @@
      * This method:
      * 1. Loads the main class from the module or class path
      * 2. Checks the public static void main method.
+     * 3. If the main class extends FX Application then call on FXHelper to
+     * perform the launch.
      *
      * @param printToStderr if set, all output will be routed to stderr
      * @param mode LaunchMode as determined by the arguments passed on the
@@ -479,11 +481,23 @@
         Class<?> mainClass = (mode == LM_MODULE) ? loadModuleMainClass(what)
                                                  : loadMainClass(mode, what);
 
-        validateMainClass(mainClass);
+        // record the real main class for UI purposes
+        // neither method above can return null, they will abort()
+        appClass = mainClass;
 
-        // record main class if not already set
-        if (appClass == null)
-            appClass = mainClass;
+        /*
+         * Check if FXHelper can launch it using the FX launcher. In an FX app,
+         * the main class may or may not have a main method, so do this before
+         * validating the main class.
+         */
+        if (JAVAFX_FXHELPER_CLASS_NAME_SUFFIX.equals(mainClass.getName()) ||
+            doesExtendFXApplication(mainClass)) {
+            // Will abort() if there are problems with FX runtime
+            FXHelper.setFXLaunchParameters(what, mode);
+            mainClass = FXHelper.class;
+        }
+
+        validateMainClass(mainClass);
 
         return mainClass;
     }
@@ -530,7 +544,6 @@
 
             String cn = Normalizer.normalize(mainClass, Normalizer.Form.NFC);
             c = Class.forName(m, cn);
-
         }
         if (c == null) {
             abort(null, "java.launcher.module.error2", mainClass, mainModule);
@@ -542,8 +555,6 @@
 
     /**
      * Loads the main class from the class path (LM_CLASS or LM_JAR).
-     * If the main class extends FX Application then call on FXHelper to
-     * determine the main class to launch.
      */
     private static Class<?> loadMainClass(int mode, String what) {
         // get the class name
@@ -570,7 +581,7 @@
             if (System.getProperty("os.name", "").contains("OS X")
                     && Normalizer.isNormalized(cn, Normalizer.Form.NFD)) {
                 try {
-                    // On Mac OS X since all names with diacretic symbols are
+                    // On Mac OS X since all names with diacritical marks are
                     // given as decomposed it is possible that main class name
                     // comes incorrectly from the command line and we have
                     // to re-compose it
@@ -583,21 +594,6 @@
                 abort(cnfe, "java.launcher.cls.error1", cn);
             }
         }
-
-        // record the main class
-        appClass = mainClass;
-
-        /*
-         * Check if FXHelper can launch it using the FX launcher. In an FX app,
-         * the main class may or may not have a main method, so do this before
-         * validating the main class.
-         */
-        if (JAVAFX_FXHELPER_CLASS_NAME_SUFFIX.equals(mainClass.getName()) ||
-            doesExtendFXApplication(mainClass)) {
-            // Will abort() if there are problems with FX runtime
-            FXHelper.setFXLaunchParameters(what, mode);
-            return FXHelper.class;
-        }
         return mainClass;
     }
 
@@ -773,9 +769,15 @@
          * java -cp somedir FXClass     N/A               LM_CLASS     "LM_CLASS"
          * java -jar fxapp.jar          Present           LM_JAR       "LM_JAR"
          * java -jar fxapp.jar          Not Present       LM_JAR       "LM_JAR"
+         * java -m module/class [1]     N/A               LM_MODULE    "LM_MODULE"
+         * java -m module               N/A               LM_MODULE    "LM_MODULE"
+         *
+         * [1] - JavaFX-Application-Class is ignored when modular args are used, even
+         * if present in a modular jar
          */
         private static final String JAVAFX_LAUNCH_MODE_CLASS = "LM_CLASS";
         private static final String JAVAFX_LAUNCH_MODE_JAR = "LM_JAR";
+        private static final String JAVAFX_LAUNCH_MODE_MODULE = "LM_MODULE";
 
         /*
          * FX application launcher and launch method, so we can launch
@@ -835,6 +837,9 @@
                 case LM_JAR:
                     fxLaunchMode = JAVAFX_LAUNCH_MODE_JAR;
                     break;
+                case LM_MODULE:
+                    fxLaunchMode = JAVAFX_LAUNCH_MODE_MODULE;
+                    break;
                 default:
                     // should not have gotten this far...
                     throw new InternalError(mode + ": Unknown launch mode");