#!/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 namesappname="@app.name@"appdom="@app.domain@"# Make a place for our logs to goappsupp="$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 fifi> "$logfile"if [ $? -ne 0 ]then die "Unable to create file '$logfile'" 2fifunction 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" fielse export JAVA_HOME="$(/usr/libexec/java_home)" if [ $? -ne 0 -o ! -d "$JAVA_HOME" ] then die "Unable to locate Java." fifijava="$JAVA_HOME/bin/java"if [ ! -x "$java" ]then die "'$java' not found or not executable"fifunction 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.plistestat=0CFBundleName=$(must_get ':CFBundleName')CFBundleIconFile=$(must_get ':CFBundleIconFile')JVMMainClassName=$(must_get ':JVMMainClassName')JVMClassPath=$(must_get ':JVMClassPath')JVMVersion=$(must_get ':JVMVersion')# Sanity check our JVM versionif [[ "$JVMVersion" == *+ ]]then op='>' JVMVersion="${JVMVersion%+}"else op='='fiversion=$("$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=0while truedo j="$(plist_get :JVMOptions:$i)" if [ -z "$j" ] then break fi JVMOptions+=("$j") let i+=1done# Fatal error if we cannot change to HOME or HOME not definedapproot="$(pwd)"if [ -z "$HOME" ]then die "HOME not defined!"ficd "$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."