5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou#!/bin/sh
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou##################################################################################
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# universalJavaApplicationStub #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# A shellscript JavaApplicationStub for Java Apps on Mac OS X #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# that works with both Apple's and Oracle's plist format. #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# Inspired by Ian Roberts stackoverflow answer #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# at http://stackoverflow.com/a/17546508/1128689 #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# @author Tobias Fischer #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# @url https://github.com/tofi86/universalJavaApplicationStub #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# @date 2015-10-08 #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# @version 1.0.0 #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou##################################################################################
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# The MIT License (MIT) #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# Copyright (c) 2015 Tobias Fischer #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# Permission is hereby granted, free of charge, to any person obtaining a copy #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# of this software and associated documentation files (the "Software"), to deal #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# in the Software without restriction, including without limitation the rights #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# copies of the Software, and to permit persons to whom the Software is #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# furnished to do so, subject to the following conditions: #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# The above copyright notice and this permission notice shall be included in all #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# copies or substantial portions of the Software. #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# SOFTWARE. #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# #
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou##################################################################################
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou#
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# resolve symlinks
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou############################################
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouPRG=$0
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouwhile [ -h "$PRG" ]; do
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou ls=`ls -ld "$PRG"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou if expr "$link" : '^/' 2> /dev/null >/dev/null; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou PRG="$link"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou else
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou PRG="`dirname "$PRG"`/$link"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou fi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitoudone
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# set the directory abspath of the current shell script
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouPROGDIR=`dirname "$PRG"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou#
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# set files and folders
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou############################################
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# the absolute path of the app package
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitoucd "$PROGDIR"/../../
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouAppPackageFolder=`pwd`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# the base path of the app package
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitoucd ..
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouAppPackageRoot=`pwd`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# set Apple's Java folder
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouAppleJavaFolder="${AppPackageFolder}"/Contents/Resources/Java
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# set Apple's Resources folder
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouAppleResourcesFolder="${AppPackageFolder}"/Contents/Resources
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# set Oracle's Java folder
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouOracleJavaFolder="${AppPackageFolder}"/Contents/Java
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# set Oracle's Resources folder
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouOracleResourcesFolder="${AppPackageFolder}"/Contents/Resources
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# set path to Info.plist in bundle
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouInfoPlistFile="${AppPackageFolder}"/Contents/Info.plist
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# set the default JVM Version to a null string
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouJVMVersion=""
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou#
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# read Info.plist and extract JVM options
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou############################################
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# read the program name from CFBundleName
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouCFBundleName=`/usr/libexec/PlistBuddy -c "print :CFBundleName" "${InfoPlistFile}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# read the icon file name
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouCFBundleIconFile=`/usr/libexec/PlistBuddy -c "print :CFBundleIconFile" "${InfoPlistFile}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# check Info.plist for Apple style Java keys -> if key :Java is present, parse in apple mode
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou/usr/libexec/PlistBuddy -c "print :Java" "${InfoPlistFile}" > /dev/null 2>&1
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouexitcode=$?
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic PoitouJavaKey=":Java"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# if no :Java key is present, check Info.plist for universalJavaApplication style JavaX keys -> if key :JavaX is present, parse in apple mode
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouif [ $exitcode -ne 0 ]; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou /usr/libexec/PlistBuddy -c "print :JavaX" "${InfoPlistFile}" > /dev/null 2>&1
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou exitcode=$?
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JavaKey=":JavaX"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitoufi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# read Info.plist in Apple style if exit code returns 0 (true, :Java key is present)
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouif [ $exitcode -eq 0 ]; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # set Java and Resources folder
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JavaFolder="${AppleJavaFolder}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou ResourcesFolder="${AppleResourcesFolder}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou APP_PACKAGE="${AppPackageFolder}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JAVAROOT="${AppleJavaFolder}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou USER_HOME="$HOME"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the Java WorkingDirectory
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMWorkDir=`/usr/libexec/PlistBuddy -c "print ${JavaKey}:WorkingDirectory" "${InfoPlistFile}" 2> /dev/null | xargs`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # set Working Directory based upon Plist info
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou if [[ ! -z ${JVMWorkDir} ]]; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou WorkingDirectory="${JVMWorkDir}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou else
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # AppPackageRoot is the standard WorkingDirectory when the script is started
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou WorkingDirectory="${AppPackageRoot}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou fi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou WorkingDirectory=`eval "echo ${WorkingDirectory}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the MainClass name
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMMainClass=`/usr/libexec/PlistBuddy -c "print ${JavaKey}:MainClass" "${InfoPlistFile}" 2> /dev/null`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the SplashFile name
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMSplashFile=`/usr/libexec/PlistBuddy -c "print ${JavaKey}:SplashFile" "${InfoPlistFile}" 2> /dev/null`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the JVM Options
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMOptions=`/usr/libexec/PlistBuddy -c "print ${JavaKey}:Properties" "${InfoPlistFile}" 2> /dev/null | grep " =" | sed 's/^ */-D/g' | tr '\n' ' ' | sed 's/ */ /g' | sed 's/ = /=/g' | xargs`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # replace occurences of $APP_ROOT with its content
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMOptions=`eval "echo ${JVMOptions}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read StartOnMainThread
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMStartOnMainThread=`/usr/libexec/PlistBuddy -c "print ${JavaKey}:StartOnMainThread" "${InfoPlistFile}" 2> /dev/null`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou if [ "${JVMStartOnMainThread}" == "true" ]; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMOptions+=" -XstartOnFirstThread"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou fi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the ClassPath in either Array or String style
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMClassPath_RAW=`/usr/libexec/PlistBuddy -c "print ${JavaKey}:ClassPath" "${InfoPlistFile}" 2> /dev/null`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou if [[ $JVMClassPath_RAW == *Array* ]] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMClassPath=.`/usr/libexec/PlistBuddy -c "print ${JavaKey}:ClassPath" "${InfoPlistFile}" 2> /dev/null | grep " " | sed 's/^ */:/g' | tr -d '\n' | xargs`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou else
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMClassPath=${JVMClassPath_RAW}
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou fi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMClassPath=`eval "echo ${JVMClassPath}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the JVM Default Options
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMDefaultOptions=`/usr/libexec/PlistBuddy -c "print ${JavaKey}:VMOptions" "${InfoPlistFile}" 2> /dev/null | xargs`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the JVM Arguments
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMArguments=`/usr/libexec/PlistBuddy -c "print ${JavaKey}:Arguments" "${InfoPlistFile}" 2> /dev/null | xargs`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # replace occurences of $APP_ROOT with its content
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMArguments=`eval "echo ${JVMArguments}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the Java version we want to find
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMVersion=`/usr/libexec/PlistBuddy -c "print ${JavaKey}:JVMVersion" "${InfoPlistFile}" 2> /dev/null | xargs`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# read Info.plist in Oracle style
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouelse
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # set Working Directory and Java and Resources folder
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JavaFolder="${OracleJavaFolder}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou ResourcesFolder="${OracleResourcesFolder}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou WorkingDirectory="${OracleJavaFolder}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou APP_ROOT="${AppPackageFolder}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the MainClass name
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMMainClass=`/usr/libexec/PlistBuddy -c "print :JVMMainClassName" "${InfoPlistFile}" 2> /dev/null`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the SplashFile name
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMSplashFile=`/usr/libexec/PlistBuddy -c "print :JVMSplashFile" "${InfoPlistFile}" 2> /dev/null`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the JVM Options
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMOptions=`/usr/libexec/PlistBuddy -c "print :JVMOptions" "${InfoPlistFile}" 2> /dev/null | grep " -" | tr -d '\n' | sed 's/ */ /g' | xargs`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # replace occurences of $APP_ROOT with its content
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMOptions=`eval "echo ${JVMOptions}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the ClassPath in either Array or String style
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMClassPath_RAW=`/usr/libexec/PlistBuddy -c "print JVMClassPath" "${InfoPlistFile}" 2> /dev/null`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou if [[ $JVMClassPath_RAW == *Array* ]] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMClassPath=.`/usr/libexec/PlistBuddy -c "print JVMClassPath" "${InfoPlistFile}" 2> /dev/null | grep " " | sed 's/^ */:/g' | tr -d '\n' | xargs`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou elif [[ ! -z ${JVMClassPath_RAW} ]] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMClassPath=${JVMClassPath_RAW}
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou else
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou #default: fallback to OracleJavaFolder
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMClassPath="${JavaFolder}/*"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou fi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMClassPath=`eval "echo ${JVMClassPath}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the JVM Default Options
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMDefaultOptions=`/usr/libexec/PlistBuddy -c "print :JVMDefaultOptions" "${InfoPlistFile}" 2> /dev/null | grep -o " \-.*" | tr -d '\n' | xargs`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # read the JVM Arguments
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMArguments=`/usr/libexec/PlistBuddy -c "print :JVMArguments" "${InfoPlistFile}" 2> /dev/null | tr -d '\n' | sed -E 's/Array \{ *(.*) *\}/\1/g' | sed 's/ */ /g' | xargs`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # replace occurences of $APP_ROOT with its content
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JVMArguments=`eval "echo ${JVMArguments}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitoufi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou#
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# function: Java version tester
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou############################################
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitoufunction JavaVersionSatisfiesRequirement() {
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou java_ver=$1
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou java_req=$2
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # e.g. 1.8*
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou if [[ ${java_req} =~ ^[0-9]\.[0-9]\*$ ]] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou java_req_num=${java_req:0:3}
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou java_ver_num=${java_ver:0:3}
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou if [ ${java_ver_num} == ${java_req_num} ] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou return 0
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou else
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou return 1
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou fi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # e.g. 1.8+
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou elif [[ ${java_req} =~ ^[0-9]\.[0-9]\+$ ]] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou java_req_num=`echo ${java_req} | sed -E 's/[[:punct:]]//g'`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou java_ver_num=`echo ${java_ver} | sed -E 's/[[:punct:]]//g'`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou if [ ${java_ver_num} -ge ${java_req_num} ] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou return 0
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou else
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou return 1
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou fi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # e.g. 1.8
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou elif [[ ${java_req} =~ ^[0-9]\.[0-9]$ ]] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou if [ ${java_ver} == ${java_req} ] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou return 0
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou else
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou return 1
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou fi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # not matching any of the above patterns
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou else
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou return 2
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou fi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou}
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou#
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# function: extract Java major version
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# from java -version command
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou############################################
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitoufunction extractJavaMajorVersion() {
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou echo `"$1" -version 2>&1 | awk '/version/{print $NF}' | sed -E 's/"([0-9.]{3})[0-9_.]{5}"/\1/g'`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou}
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou#
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# find installed Java versions
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou############################################
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouapple_jre_plugin="/Library/Java/Home/bin/java"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouapple_jre_version=`extractJavaMajorVersion "${apple_jre_plugin}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouoracle_jre_plugin="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouoracle_jre_version=`extractJavaMajorVersion "${oracle_jre_plugin}"`
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# first check system variable "$JAVA_HOME"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouif [ -n "$JAVA_HOME" ] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JAVACMD="$JAVA_HOME/bin/java"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# check for JVMversion requirements
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouelif [ ! -z ${JVMVersion} ] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # first in "/usr/libexec/java_home" symlinks
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou if [ -x /usr/libexec/java_home ] && /usr/libexec/java_home -F -v ${JVMVersion} > /dev/null ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JAVACMD="`/usr/libexec/java_home -F -v ${JVMVersion} 2> /dev/null`/bin/java"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # then in Apple JRE plugin
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou elif [ -x "${apple_jre_plugin}" ] && JavaVersionSatisfiesRequirement ${apple_jre_version} ${JVMVersion} ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JAVACMD="${apple_jre_plugin}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # then in Oracle JRE plugin
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou elif [ -x "${oracle_jre_plugin}" ] && JavaVersionSatisfiesRequirement ${oracle_jre_version} ${JVMVersion} ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JAVACMD="${oracle_jre_plugin}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou else
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # display error message with applescript
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou osascript -e "tell application \"System Events\" to display dialog \"ERROR launching '${CFBundleName}'\n\nNo suitable Java version found on your system!\nThis program requires Java ${JVMVersion}\nMake sure you install the required Java version.\" with title \"${CFBundleName}\" buttons {\" OK \"} default button 1 with icon path to resource \"${CFBundleIconFile}\" in bundle (path to me)"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # exit with error
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou exit 3
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou fi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# otherwise check "/usr/libexec/java_home" symlinks
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouelif [ -x /usr/libexec/java_home ] && /usr/libexec/java_home -F > /dev/null; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JAVACMD="`/usr/libexec/java_home 2> /dev/null`/bin/java"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# otherwise check Java standard symlink (old Apple JRE)
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouelif [ -h /Library/Java/Home ]; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JAVACMD="${apple_jre_plugin}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# fallback: public JRE plugin (Oracle Java)
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouelse
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou JAVACMD="${oracle_jre_plugin}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitoufi
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# fallback fallback: /usr/bin/java
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# but this would prompt to install deprecated Apple Java 6
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou#
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# execute JAVA commandline and do some pre-checks
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou####################################################
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# display error message if MainClassName is empty
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouif [ -z ${JVMMainClass} ]; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # display error message with applescript
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou osascript -e "tell application \"System Events\" to display dialog \"ERROR launching '${CFBundleName}'!\n\n'MainClass' isn't specified!\nJava application cannot be started!\" with title \"${CFBundleName}\" buttons {\" OK \"} default button 1 with icon path to resource \"${CFBundleIconFile}\" in bundle (path to me)"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # exit with error
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou exit 2
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou# check whether $JAVACMD is a file and executable
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouelif [ -f "$JAVACMD" ] && [ -x "$JAVACMD" ] ; then
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # enable drag&drop to the dock icon
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou export CFProcessPath="$0"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # change to Working Directory based upon Apple/Oracle Plist info
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou cd "${WorkingDirectory}"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # execute Java and set
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # - classpath
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # - dock icon
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # - application name
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # - JVM options
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # - JVM default options
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # - main class
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # - JVM arguments
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou exec "$JAVACMD" \
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou -cp "${JVMClassPath}" \
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou -splash:"${ResourcesFolder}/${JVMSplashFile}" \
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou -Xdock:icon="${ResourcesFolder}/${CFBundleIconFile}" \
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou -Xdock:name="${CFBundleName}" \
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou ${JVMOptions:+$JVMOptions }\
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou ${JVMDefaultOptions:+$JVMDefaultOptions }\
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou ${JVMMainClass}\
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou ${JVMArguments:+ $JVMArguments}
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitouelse
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # display error message with applescript
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou osascript -e "tell application \"System Events\" to display dialog \"ERROR launching '${CFBundleName}'!\n\nYou need to have JAVA installed on your Mac!\nVisit http://java.com for more information...\" with title \"${CFBundleName}\" buttons {\" OK \"} default button 1 with icon path to resource \"${CFBundleIconFile}\" in bundle (path to me)"
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # and open java.com
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou open http://java.com
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou # exit with error
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitou exit 1
5e5acc733bf20faa22d4e9be582f555bbda0867bLudovic Poitoufi