X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FLauncher.java;h=507f5013430b2b6e3c956f440382fd9cec5863ef;hb=3fdc889794e3566af57628f0b6a308eb23886f96;hp=c5268fa05a6a120c2dbca2d8d019d899d848e8a5;hpb=1828f012a09cc00f8748fd9ee5b53af0779a8945;p=jalview.git diff --git a/src/jalview/bin/Launcher.java b/src/jalview/bin/Launcher.java index c5268fa..507f501 100644 --- a/src/jalview/bin/Launcher.java +++ b/src/jalview/bin/Launcher.java @@ -26,6 +26,7 @@ import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.concurrent.TimeUnit; import jalview.util.ChannelProperties; import jalview.util.LaunchUtils; @@ -49,8 +50,15 @@ public class Launcher { private final static String startClass = "jalview.bin.Jalview"; - private final static String dockIconPath = ChannelProperties - .getProperty("logo.512"); + // not setting this yet due to problem with Jmol + private final static String headlessProperty = "java.awt.headless"; + + // used for headless macOS + private final static String macosHeadlessProperty = "apple.awt.UIElement"; + + // arguments that assume headless mode + private final static String[] assumeHeadlessArgs = { "headless", "output", + "image", "structureimage" }; /** * main method for jalview.bin.Launcher. This restarts the same JRE's JVM with @@ -64,59 +72,99 @@ public class Launcher { if (!LaunchUtils.checkJavaVersion()) { - System.err.println("WARNING - The Java version being used (Java " - + LaunchUtils.getJavaVersion() - + ") may lead to problems. This installation of Jalview should be used with Java " - + LaunchUtils.getJavaCompileVersion() + "."); - } - - final String javaBin = System.getProperty("java.home") + File.separator - + "bin" + File.separator + "java"; - - List command = new ArrayList<>(); - command.add(javaBin); - - String memSetting = null; - - boolean isAMac = System.getProperty("os.name").indexOf("Mac") > -1; - - for (String jvmArg : ManagementFactory.getRuntimeMXBean() - .getInputArguments()) - { - command.add(jvmArg); + jalview.bin.Console + .errPrintln("WARNING - The Java version being used (Java " + + LaunchUtils.getJavaVersion() + + ") may lead to problems. This installation of Jalview should be used with Java " + + LaunchUtils.getJavaCompileVersion() + "."); } - command.add("-cp"); - command.add(ManagementFactory.getRuntimeMXBean().getClassPath()); String jvmmempc = null; String jvmmemmax = null; boolean debug = false; - boolean help = false; + boolean wait = true; boolean quiet = false; + boolean headless = false; + boolean assumeheadless = false; + boolean gui = false; + boolean help = false; + boolean stdout = false; + // must set --debug before --launcher... boolean launcherstop = false; boolean launcherprint = false; + boolean launcherwait = false; ArrayList arguments = new ArrayList<>(); + String previousArg = null; + // set debug first for (String arg : args) { if (arg.equals("--debug")) { debug = true; } + } + for (String arg : args) + { if (arg.equals("--quiet")) { quiet = true; } - if (arg.equals("--help") || arg.startsWith("--help-")) + else if (arg.equals("--gui")) + { + gui = true; + } + else if (arg.equals("--help")) { help = true; } - if (arg.equals("--launcherprint")) + else if (arg.equals("--version")) { - launcherprint = true; + help = true; + } + + if (!assumeheadless) + { + for (String a : assumeHeadlessArgs) + { + if (arg.equals("--" + a) || arg.startsWith("--" + a + "=")) + { + assumeheadless = true; + } + } + } + + if (arg.equals("--output=-") + || (arg.equals("-") && "--output".equals(previousArg))) + { + stdout = true; + } + + if (debug) + { + if (arg.equals("--launcherprint")) + { + launcherprint = true; + } + else if (arg.equals("--launcherstop")) + { + launcherstop = true; + } + else if (arg.equals("--launcherwait")) + { + launcherwait = true; + } + else + // this ends the launcher immediately + if (arg.equals("--launchernowait")) + { + wait = false; + } } - if (arg.equals("--launcherstop")) + previousArg = arg; + // Don't add the --launcher... args to Jalview launch + if (arg.startsWith("--launcher")) { - launcherstop = true; + continue; } // jvmmempc and jvmmemmax args used to set memory and are not passed on to // startClass @@ -153,6 +201,39 @@ public class Launcher arguments.add(arg); } } + if (help) + { + // --help takes precedence over --gui + headless = true; + } + else if (gui) + { + // --gui takes precedence over --headless + headless = false; + } + else + { + // --output arguments assume headless mode + headless = assumeheadless; + } + + final String appName = ChannelProperties.getProperty("app_name"); + + // if we're using jalview.bin.Launcher we always assume a console is in use + final String javaBin = LaunchUtils.findJavaBin(true); + + List command = new ArrayList<>(); + command.add(javaBin); + + String memSetting = null; + + for (String jvmArg : ManagementFactory.getRuntimeMXBean() + .getInputArguments()) + { + command.add(jvmArg); + } + command.add("-cp"); + command.add(ManagementFactory.getRuntimeMXBean().getClassPath()); // use saved preferences if no cmdline args boolean useCustomisedSettings = LaunchUtils @@ -175,6 +256,8 @@ public class Launcher boolean memSet = false; boolean dockIcon = false; boolean dockName = false; + boolean headlessProp = false; + boolean macosHeadlessProp = false; for (int i = 0; i < command.size(); i++) { String arg = command.get(i); @@ -195,6 +278,14 @@ public class Launcher { dockName = true; } + else if (arg.startsWith("-D" + headlessProperty + "=")) + { + headlessProp = true; + } + else if (arg.startsWith("-D" + macosHeadlessProperty + "=")) + { + macosHeadlessProp = true; + } } if (!memSet) @@ -209,35 +300,44 @@ public class Launcher } } - if (isAMac) + if (LaunchUtils.isMac) { if (!dockIcon) { + String dockIconPath = System.getProperty("getdownappdir", ".") + + File.separator + "resource/jalview_logo.png"; command.add("-Xdock:icon=" + dockIconPath); } if (!dockName) { // -Xdock:name=... doesn't actually work :( // Leaving it in in case it gets fixed - command.add( - "-Xdock:name=" + ChannelProperties.getProperty("app_name")); - // this launches WITHOUT an icon in the macOS dock. Could be useful for - // getdown? - // command.add("-Dapple.awt.UIElement=false"); + command.add("-Xdock:name=" + appName); // This also does not work for the dock command.add("-Dcom.apple.mrj.application.apple.menu.about.name=" - + ChannelProperties.getProperty("app_name")); + + appName); } } + if (headless && !headlessProp) + { + System.setProperty(headlessProperty, "true"); + /* not setting this in java invocation of running jalview due to problem with Jmol */ + if (help) + { + command.add("-D" + headlessProperty + "=true"); + } + } + if (headless && LaunchUtils.isMac && !macosHeadlessProp) + { + System.setProperty(macosHeadlessProperty, "true"); + command.add("-D" + macosHeadlessProperty + "=true"); + } String scalePropertyArg = HiDPISetting.getScalePropertyArg(); if (scalePropertyArg != null) { - if (debug && !quiet) - { - System.out.println("Running " + startClass + " with scale setting " - + scalePropertyArg); - } + syserr(debug, quiet, "Running " + startClass + " with scale setting " + + scalePropertyArg); command.add(scalePropertyArg); } @@ -246,40 +346,47 @@ public class Launcher final ProcessBuilder builder = new ProcessBuilder(command); - if (!quiet && (Boolean - .parseBoolean(System.getProperty("launcherprint", "false")) - || (debug && launcherprint))) + if ((Boolean.parseBoolean(System.getProperty("launcherprint", "false")) + || launcherprint)) { - System.out.println( + syserr(debug, quiet, "LAUNCHER COMMAND: " + String.join(" ", builder.command())); } - if (debug && !quiet) - { - System.out.println("Running " + startClass + " with " - + (memSetting == null ? "no memory setting" - : ("memory setting " + memSetting))); - } + syserr(debug, quiet, + "Running " + startClass + " with " + + (memSetting == null ? "no memory setting" + : ("memory setting " + memSetting))); if (Boolean.parseBoolean(System.getProperty("launcherstop", "false")) || (debug && launcherstop)) { - if (!quiet) - { - System.out.println( - "System property 'launcherstop' is set and not 'false'. Exiting."); - } + syserr(debug, quiet, + "System property 'launcherstop' is set and not 'false'. Exiting."); System.exit(0); } try { builder.inheritIO(); Process process = builder.start(); - process.waitFor(); + if (wait || launcherwait) + { + syserr(debug, quiet, "Launching application process"); + process.waitFor(); + } + else + { + int waitInt = 0; + syserr(debug, quiet, + "Wait time for application process is " + waitInt + "ms"); + process.waitFor(waitInt, TimeUnit.MILLISECONDS); + } + syserr(debug, quiet, "Launcher process ending"); } catch (IOException e) { if (e.getMessage().toLowerCase(Locale.ROOT).contains("memory")) { - System.err.println("Caught a memory exception: " + e.getMessage()); + jalview.bin.Console + .errPrintln("Caught a memory exception: " + e.getMessage()); // Probably the "Cannot allocate memory" error, try without the memory // setting ArrayList commandNoMem = new ArrayList<>(); @@ -292,7 +399,7 @@ public class Launcher } final ProcessBuilder builderNoMem = new ProcessBuilder( commandNoMem); - System.err.println("Command without memory setting: " + jalview.bin.Console.errPrintln("Command without memory setting: " + String.join(" ", builderNoMem.command())); try { @@ -314,4 +421,12 @@ public class Launcher } } + private static void syserr(boolean debug, boolean quiet, String message) + { + if (debug && !quiet) + { + jalview.bin.Console.errPrintln("LAUNCHERDEBUG - " + message); + } + } + }