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;
{
private final static String startClass = "jalview.bin.Jalview";
- private final static String dockIconPath = ChannelProperties
- .getProperty("logo.512");
+ 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
{
if (!LaunchUtils.checkJavaVersion())
{
- System.err.println("WARNING - The Java version being used (Java "
+ 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() + ".");
}
-
- final String javaBin = System.getProperty("java.home") + File.separator
- + "bin" + File.separator + "java";
+ 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<String> command = new ArrayList<>();
command.add(javaBin);
String jvmmempc = null;
String jvmmemmax = null;
boolean debug = false;
- boolean help = false;
+ boolean wait = true;
boolean quiet = false;
+ boolean stdout = false;
+ // must set --debug before --launcher...
boolean launcherstop = false;
boolean launcherprint = false;
+ boolean launcherwait = false;
ArrayList<String> arguments = new ArrayList<>();
+ String previousArg = null;
for (String arg : args)
{
if (arg.equals("--debug"))
{
quiet = true;
}
- if (arg.equals("--help") || arg.startsWith("--help-"))
+ if (arg.equals("--output=-")
+ || (arg.equals("-") && "--output".equals(previousArg)))
{
- help = true;
+ stdout = true;
}
- if (arg.equals("--launcherprint"))
+ if (debug && arg.equals("--launcherprint"))
{
launcherprint = true;
}
- if (arg.equals("--launcherstop"))
+ 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;
+ }
+ previousArg = arg;
+ // 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(
{
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"));
+ 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="
- + ChannelProperties.getProperty("app_name"));
+ + appName);
}
}
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);
}
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<String> commandNoMem = new ArrayList<>();
}
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
{
}
}
+ private static void syserr(boolean debug, boolean quiet, String message)
+ {
+ if (debug && !quiet)
+ {
+ jalview.bin.Console.errPrintln("LAUNCHERDEBUG - " + message);
+ }
+ }
+
}