diff package-files/osx/JavaApplicationStub @ 39:89d7f4d91f67

Got a working, non-bloated Apple Mac bundle!
author David Barts <n5jrn@me.com>
date Fri, 01 May 2020 23:06:04 -0700
parents
children a65a8f5a9647
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/package-files/osx/JavaApplicationStub	Fri May 01 23:06:04 2020 -0700
@@ -0,0 +1,166 @@
+#!/bin/bash
+
+# This is based on Tobias Fischer's universalJavaApplicationStub:
+# https://github.com/tofi86/universalJavaApplicationStub
+#
+# Therefore this part of JpegWasher is covered by the same MIT license
+# that his code is:
+#
+# The MIT License (MIT)
+#
+# Copyright (c) 2014-2020 Tobias Fischer
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+# Establish our application names
+appname="@app.name@"
+appdom="@app.domain@"
+
+# Make a place for our logs to go
+appsupp="$HOME/Library/Application Support/$appdom"
+logfile="$appsupp/launcher.log"
+
+function die {
+    osascript -e "tell application \"System Events\" to display dialog \"${1}\" with title \"Fatal Error\" buttons {\" OK \"} default button 1"
+    exit ${2:-1}
+}
+
+# Initialize files and dirs, bail if we can't.
+if [ ! -d "$appsupp" ]
+then
+    if ! mkdir -p "$appsupp"
+    then
+		die "Unable to create folder '$appsupp'" 2
+    fi
+fi
+> "$logfile"
+if [ $? -ne 0 ]
+then
+    die "Unable to create file '$logfile'" 2
+fi
+
+function stub_logger {
+    echo "$(date +%c) - $1" >> "$logfile"
+}
+
+# Was originally just for debugging, but I think this could be useful
+# for later troubleshooting "in the wild."
+stub_logger "execution begins"
+{
+    echo "****** BEGIN ARGUMENT AND ENVIRONMENT DUMP *******"
+    echo "Arguments:" "$0" "$@"
+    echo "Directory:" $(pwd)
+    env
+    echo "******* END ARGUMENT AND ENVIRONMENT DUMP ********"
+} >> "$logfile"
+
+# Change to the application root directory, two up from where this script
+# (which should contain an absolute path) is.
+mydir="${0%/*}"
+cd "$mydir/../.." || die "Unable to cd '$mydir/../..'"
+
+# Determine where Java is, bail if we can't.
+if [ -n "$JAVA_HOME" ]
+then
+    if [ ! -d "$JAVA_HOME" ]
+    then
+        die "'$JAVA_HOME' does not exist"
+    fi
+else
+    export JAVA_HOME="$(/usr/libexec/java_home)"
+    if [ $? -ne 0 -o ! -d "$JAVA_HOME" ]
+    then
+        die "Unable to locate Java."
+    fi
+fi
+
+java="$JAVA_HOME/bin/java"
+if [ ! -x "$java" ]
+then
+    die "'$java' not found or not executable"
+fi
+
+# function 'plist_get()'
+#
+# read a specific Plist key with 'PlistBuddy' utility
+#
+# @param1  the Plist key with leading colon ':'
+# @return  the value as String or Array
+################################################################################
+function plist_get {
+	/usr/libexec/PlistBuddy -c "print $1" Contents/Info.plist 2> /dev/null
+}
+function must_get {
+    plist_get "$@" || die "Info.plist key '$1' not found."
+}
+
+# Load some parameters from Contents/Info.plist
+estat=0
+CFBundleName=$(must_get ':CFBundleName')
+CFBundleIconFile=$(must_get ':CFBundleIconFile')
+JVMMainClassName=$(must_get ':JVMMainClassName')
+JVMClassPath=$(must_get ':JVMClassPath')
+JVMVersion=$(must_get ':JVMVersion')
+
+# Sanity check our JVM version
+if [[ "$JVMVersion" == *+ ]]
+then
+    op='>'
+    JVMVersion="${JVMVersion%+}"
+else
+    op='='
+fi
+version=$("$java" -version 2>&1 | awk '/version/{print $3}' | sed -E -e 's/"//g' -e 's/-ea//g')
+if [ ! "$version" "$op" "$JVMVersion" ]
+then
+    die "'$java' too old"
+fi
+
+# Load the JVMOptions array (if found)
+JVMOptions=()
+let i=0
+while true
+do
+    j="$(plist_get :JVMOptions:$i)"
+    if [ -z "$j" ]
+    then
+        break
+    fi
+    JVMOptions+=("$j")
+    let i+=1
+done
+
+# Fatal error if we cannot change to HOME or HOME not defined
+approot="$(pwd)"
+if [ -z "$HOME" ]
+then
+    die "HOME not defined!"
+fi
+cd "$HOME" || die "Unable to cd '$HOME'"
+
+# And off we go!
+jcmd=( "$JAVA_HOME/bin/java" -cp "$approot/$JVMClassPath"
+    -Xdock:icon="$approot/Contents/Resources/$CFBundleIconFile"
+    -Xdock:name="$CFBundleName" "${JVMOptions[@]}" "$JVMMainClassName" )
+
+stub_logger "Executing: ${jcmd[@]}"
+exec "${jcmd[@]}"
+
+# This shouldn't happen...
+die "Could not launch Java."