JAL-3820 Create and use 'Jalview app' symblinks to java executable. Fixes grouped...
[jalview.git] / src / jalview / bin / Launcher.java
index f29e0a1..246f0a2 100644 (file)
@@ -53,6 +53,29 @@ public class Launcher
   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
    * the same arguments but with memory adjusted based on extracted -jvmmempc
@@ -70,9 +93,22 @@ public class Launcher
               + ") 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);
@@ -232,14 +268,13 @@ public class Launcher
       {
         // -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);
       }
     }