From: Jim Procter Date: Mon, 17 Sep 2018 11:20:45 +0000 (+0100) Subject: Use args[] form of System.exec in order to resolve path to java on osx that may inclu... X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=35a7f4a91aa5974bc3a3b122f62c7f6eeae17118;p=jalview.git Use args[] form of System.exec in order to resolve path to java on osx that may include spaces --- diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index 062a22a..8203663 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -199,18 +199,35 @@ public class Jalview || System.getProperty("java.version").startsWith("1.9."); if (maxMemory < 1024 * 14) { - String cmd = ""; + ArrayList cmd = new ArrayList(); + + boolean dontspawn=false; for (String r : args) { - cmd += (cmd.length() == 0) ? r : " " + r; + cmd.add(r); + if (r.indexOf("-Xmx")>-1) { + dontspawn=true; + break; + } } - if (cmd.indexOf("-Xmx") == -1) + if (!dontspawn) { - cmd = "-Xmx15G " + cmd; - System.err.println("relaunching with 15G: " + cmd); - Worker worker = Worker.jalviewDesktopRunner(false, cmd, 0, - "-Xmx15G" - + (is9or10 ? " --add-modules=\"java.se.ee\"" : "")); + cmd.add("-Xmx15G"); + String[] javargs=new String[1]; + if (is9or10) { + javargs = new String[2]; + javargs[1] = "--add-modules=java.se.ee"; + } + javargs[0]="-Xmx15G"; + + System.err.print("relaunching with 15G: "); + for (String r : cmd) + { + System.err.print(r + " "); + } + System.err.println(""); + Worker worker = Worker.jalviewDesktopRunner(false, + cmd.toArray(new String[0]), 0, javargs); worker.doEcho(); try { diff --git a/src/jalview/util/Worker.java b/src/jalview/util/Worker.java index ff7f0a9..b5297e1 100644 --- a/src/jalview/util/Worker.java +++ b/src/jalview/util/Worker.java @@ -5,6 +5,8 @@ import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Arrays; import io.github.classgraph.ClassGraph; import io.github.classgraph.ScanResult; @@ -121,8 +123,21 @@ public class Worker extends Thread // not expanded by the shell String classpath = getClassPath(); String javahome = System.getProperty("java.home"); - - String _cmd = javahome + File.pathSeparator + "java " + File java = new File(javahome + File.separator + "bin" + + File.separator + "java"); + if (!java.exists()) + { + System.err.println("Can't find " + java.getAbsolutePath()); + java = new File(javahome + File.separator + "bin" + + File.separator + "java.exe"); + if (!java.exists()) + { + System.err.println("Can't find " + java.getAbsolutePath()); + throw new Error( + "Can't locate java in JAVA_HOME/bin/java or JAVA_HOME/bin/java.exe"); + } + } + String _cmd = "\"" + javahome + "\" " + (withAwt ? "-Djava.awt.headless=true" : "") + " -classpath " + classpath + " " + javaArgs + " jalview.bin.Jalview "; @@ -156,6 +171,69 @@ public class Worker extends Thread return worker; } + public static Worker jalviewDesktopRunner(boolean withAwt, String[] args, + int timeout, String[] javaArgs) + { + // Note: JAL-3065 - don't include quotes for lib/* because the arguments are + // not expanded by the shell + String classpath = getClassPath(); + String javahome = System.getProperty("java.home"); + File java = new File( + javahome + File.separator + "bin" + File.separator + "java"); + if (!java.exists()) + { + System.err.println("Can't find " + java.getAbsolutePath()); + java = new File(javahome + File.separator + "bin" + File.separator + + "java.exe"); + if (!java.exists()) + { + System.err.println("Can't find " + java.getAbsolutePath()); + throw new Error( + "Can't locate java in JAVA_HOME/bin/java or JAVA_HOME/bin/java.exe"); + } + } + ArrayList _cmd = new ArrayList(); + _cmd.add(java.getAbsolutePath()); + if (withAwt) + { + _cmd.add("-Djava.awt.headless=true"); + } + _cmd.add("-classpath"); + _cmd.add(classpath); + _cmd.addAll(Arrays.asList(javaArgs)); + _cmd.add("jalview.bin.Jalview"); + _cmd.addAll(Arrays.asList(args)); + Process ls2_proc = null; + Worker worker = null; + try + { + ls2_proc = Runtime.getRuntime() + .exec(_cmd.toArray(new String[_cmd.size()])); + } catch (IOException e1) + { + e1.printStackTrace(); + } + if (ls2_proc != null) + { + BufferedReader outputReader = new BufferedReader( + new InputStreamReader(ls2_proc.getInputStream())); + BufferedReader errorReader = new BufferedReader( + new InputStreamReader(ls2_proc.getErrorStream())); + worker = new Worker(ls2_proc); + worker.start(); + try + { + worker.join(timeout); + } catch (InterruptedException e) + { + // e.printStackTrace(); + } + worker.setOutputReader(outputReader); + worker.setErrorReader(errorReader); + } + return worker; + } + class Echo { public Echo(final PrintStream out, final BufferedReader source)