X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FLauncher.java;h=a87d32211d9bd1b727fa12cfd90ed4bc61644c4e;hb=f6e495e7dace3de7fd890cb9f817a99ec5fcbbcc;hp=5e6e48c268ba84cb63965d2f34368464ae005d7f;hpb=1e26a902b2a53081ab6035d43c2bdf13f1a7ee4e;p=jalview.git diff --git a/src/jalview/bin/Launcher.java b/src/jalview/bin/Launcher.java index 5e6e48c..a87d322 100644 --- a/src/jalview/bin/Launcher.java +++ b/src/jalview/bin/Launcher.java @@ -25,6 +25,11 @@ import java.io.IOException; 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; /** * A Launcher class for Jalview. This class is used to launch Jalview from the @@ -45,7 +50,28 @@ public class Launcher { private final static String startClass = "jalview.bin.Jalview"; - private final static String dockIconPath = "JalviewLogo_Huge.png"; + private static boolean checkJVMSymlink(String testBin) + { + File testBinFile = new File(testBin); + if (!testBinFile.exists()) + { + return false; + } + File targetFile = null; + try + { + targetFile = testBinFile.getCanonicalFile(); + } catch (IOException e) + { + return false; + } + if (targetFile != null && ("java".equals(targetFile.getName()) + || "java.exe".equals(targetFile.getName()))) + { + return true; + } + return false; + } /** * main method for jalview.bin.Launcher. This restarts the same JRE's JVM with @@ -57,8 +83,29 @@ public class Launcher */ public static void main(String[] args) { - final String javaBin = System.getProperty("java.home") + File.separator - + "bin" + File.separator + "java"; + 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 appName = ChannelProperties.getProperty("app_name"); + final String javaBinDir = System.getProperty("java.home") + + File.separator + "bin" + File.separator; + String javaBin = null; + if (javaBin == null && checkJVMSymlink(javaBinDir + appName)) + { + javaBin = javaBinDir + appName; + } + if (javaBin == null && checkJVMSymlink(javaBinDir + "Jalview")) + { + javaBin = javaBinDir + "Jalview"; + } + if (javaBin == null) + { + javaBin = "java"; + } List command = new ArrayList<>(); command.add(javaBin); @@ -77,9 +124,46 @@ public class Launcher String jvmmempc = null; String jvmmemmax = null; + boolean debug = false; + boolean wait = true; + boolean quiet = false; + // must set --debug before --launcher... + boolean launcherstop = false; + boolean launcherprint = false; + boolean launcherwait = false; ArrayList arguments = new ArrayList<>(); for (String arg : args) { + if (arg.equals("--debug")) + { + debug = true; + } + if (arg.equals("--quiet")) + { + quiet = true; + } + if (debug && arg.equals("--launcherprint")) + { + launcherprint = true; + } + if (debug && arg.equals("--launcherstop")) + { + launcherstop = true; + } + if (debug && arg.equals("--launcherwait")) + { + launcherwait = true; + } + // this ends the launcher immediately + if (debug && arg.equals("--launchernowait")) + { + wait = false; + } + // Don't add the --launcher... args to Jalview launch + if (arg.startsWith("--launcher")) + { + continue; + } // jvmmempc and jvmmemmax args used to set memory and are not passed on to // startClass if (arg.startsWith( @@ -95,13 +179,45 @@ public class Launcher jvmmemmax = arg.substring( MemorySetting.MAX_HEAPSIZE_PROPERTY_NAME.length() + 2); } + // --doubledash versions + else if (arg.startsWith("--" + + MemorySetting.MAX_HEAPSIZE_PERCENT_PROPERTY_NAME + "=")) + { + jvmmempc = arg.substring( + MemorySetting.MAX_HEAPSIZE_PERCENT_PROPERTY_NAME.length() + + 3); + } + else if (arg.startsWith( + "--" + MemorySetting.MAX_HEAPSIZE_PROPERTY_NAME + "=")) + { + jvmmemmax = arg.substring( + MemorySetting.MAX_HEAPSIZE_PROPERTY_NAME.length() + 3); + } + // retain arg else { arguments.add(arg); } } - // add memory setting if not specified + // use saved preferences if no cmdline args + boolean useCustomisedSettings = LaunchUtils + .getBooleanUserPreference(MemorySetting.CUSTOMISED_SETTINGS); + if (useCustomisedSettings) + { + if (jvmmempc == null) + { + jvmmempc = LaunchUtils + .getUserPreference(MemorySetting.MEMORY_JVMMEMPC); + } + if (jvmmemmax == null) + { + jvmmemmax = LaunchUtils + .getUserPreference(MemorySetting.MEMORY_JVMMEMMAX); + } + } + + // add these settings if not already specified boolean memSet = false; boolean dockIcon = false; boolean dockName = false; @@ -143,19 +259,29 @@ public class Launcher { 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=" + "Jalview"); + command.add("-Xdock:name=" + appName); + // this launches WITHOUT an icon in the macOS dock. Could be useful for + // getdown? + // command.add("-Dapple.awt.UIElement=false"); + // This also does not work for the dock + command.add("-Dcom.apple.mrj.application.apple.menu.about.name=" + + appName); } } String scalePropertyArg = HiDPISetting.getScalePropertyArg(); if (scalePropertyArg != null) { + sysout(debug, quiet, "Running " + startClass + " with scale setting " + + scalePropertyArg); command.add(scalePropertyArg); } @@ -164,24 +290,46 @@ public class Launcher final ProcessBuilder builder = new ProcessBuilder(command); - // System.out.println("COMMAND: " + String.join(" ", builder.command())); - System.out.println("Running " + startClass + " with " - + (memSetting == null ? "no memory setting" : memSetting)); + if ((Boolean.parseBoolean(System.getProperty("launcherprint", "false")) + || launcherprint)) + { + sysout(debug, quiet, + "LAUNCHER COMMAND: " + String.join(" ", builder.command())); + } + sysout(debug, quiet, + "Running " + startClass + " with " + + (memSetting == null ? "no memory setting" + : ("memory setting " + memSetting))); - if (Boolean.parseBoolean(System.getProperty("launcherstop"))) + if (Boolean.parseBoolean(System.getProperty("launcherstop", "false")) + || (debug && launcherstop)) { + sysout(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) + { + sysout(debug, quiet, "Launching application process"); + process.waitFor(); + } + else + { + int waitInt = 0; + sysout(debug, quiet, + "Wait time for application process is " + waitInt + "ms"); + process.waitFor(waitInt, TimeUnit.MILLISECONDS); + } + sysout(debug, quiet, "Launcher process ending"); } catch (IOException e) { - if (e.getMessage().toLowerCase().contains("memory")) + if (e.getMessage().toLowerCase(Locale.ROOT).contains("memory")) { - System.out.println("Caught a memory exception: " + e.getMessage()); + System.err.println("Caught a memory exception: " + e.getMessage()); // Probably the "Cannot allocate memory" error, try without the memory // setting ArrayList commandNoMem = new ArrayList<>(); @@ -194,7 +342,7 @@ public class Launcher } final ProcessBuilder builderNoMem = new ProcessBuilder( commandNoMem); - System.out.println("Command without memory setting: " + System.err.println("Command without memory setting: " + String.join(" ", builderNoMem.command())); try { @@ -214,8 +362,14 @@ public class Launcher { e.printStackTrace(); } - // System.exit(0); + } + private static void sysout(boolean debug, boolean quiet, String message) + { + if (debug && !quiet) + { + System.out.println("LAUNCHERDEBUG - " + message); + } } }