1111# #
1212# @author Tobias Fischer #
1313# @url https://github.com/tofi86/universalJavaApplicationStub #
14- # @date 2021-01-07 #
15- # @version 3.1 .0 #
14+ # @date 2021-02-21 #
15+ # @version 3.2 .0 #
1616# #
1717# #################################################################################
1818# #
@@ -166,6 +166,8 @@ if [ $exitcode -eq 0 ]; then
166166 JavaFolder=" ${AppleJavaFolder} "
167167 ResourcesFolder=" ${AppleResourcesFolder} "
168168
169+ # set expandable variables
170+ APP_ROOT=" ${AppPackageFolder} "
169171 APP_PACKAGE=" ${AppPackageFolder} "
170172 JAVAROOT=" ${AppleJavaFolder} "
171173 USER_HOME=" $HOME "
@@ -180,9 +182,10 @@ if [ $exitcode -eq 0 ]; then
180182 # AppPackageRoot is the standard WorkingDirectory when the script is started
181183 WorkingDirectory=" ${AppPackageRoot} "
182184 fi
183- # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
185+ # expand variables $APP_PACKAGE, $APP_ROOT, $ JAVAROOT, $USER_HOME
184186 WorkingDirectory=$( eval echo " ${WorkingDirectory} " )
185187
188+
186189 # read the MainClass name
187190 JVMMainClass=" $( plist_get_java ' :MainClass' ) "
188191
@@ -202,7 +205,7 @@ if [ $exitcode -eq 0 ]; then
202205 else
203206 JVMClassPath=${JVMClassPath_RAW}
204207 fi
205- # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
208+ # expand variables $APP_PACKAGE, $APP_ROOT, $ JAVAROOT, $USER_HOME
206209 JVMClassPath=$( eval echo " ${JVMClassPath} " )
207210
208211 # read the JVM Options in either Array or String style
@@ -212,7 +215,7 @@ if [ $exitcode -eq 0 ]; then
212215 else
213216 JVMDefaultOptions=${JVMDefaultOptions_RAW}
214217 fi
215- # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME (#84)
218+ # expand variables $APP_PACKAGE, $APP_ROOT, $ JAVAROOT, $USER_HOME (#84)
216219 JVMDefaultOptions=$( eval echo " ${JVMDefaultOptions} " )
217220
218221 # read StartOnMainThread and add as -XstartOnFirstThread
@@ -248,7 +251,11 @@ else
248251 ResourcesFolder=" ${OracleResourcesFolder} "
249252 WorkingDirectory=" ${OracleJavaFolder} "
250253
254+ # set expandable variables
251255 APP_ROOT=" ${AppPackageFolder} "
256+ APP_PACKAGE=" ${AppPackageFolder} "
257+ JAVAROOT=" ${OracleJavaFolder} "
258+ USER_HOME=" $HOME "
252259
253260 # read the MainClass name
254261 JVMMainClass=" $( plist_get ' :JVMMainClassName' ) "
@@ -266,12 +273,12 @@ else
266273 JVMClassPath_RAW=$( plist_get ' :JVMClassPath' )
267274 if [[ $JVMClassPath_RAW == * Array* ]] ; then
268275 JVMClassPath=.$( plist_get ' :JVMClassPath' | grep " " | sed ' s/^ */:/g' | tr -d ' \n' | xargs)
269- # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
276+ # expand variables $APP_PACKAGE, $APP_ROOT, $ JAVAROOT, $USER_HOME
270277 JVMClassPath=$( eval echo " ${JVMClassPath} " )
271278
272279 elif [[ ! -z ${JVMClassPath_RAW} ]] ; then
273280 JVMClassPath=${JVMClassPath_RAW}
274- # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
281+ # expand variables $APP_PACKAGE, $APP_ROOT, $ JAVAROOT, $USER_HOME
275282 JVMClassPath=$( eval echo " ${JVMClassPath} " )
276283
277284 else
@@ -280,8 +287,11 @@ else
280287 # Do NOT expand the default 'AppName.app/Contents/Java/*' classpath (#42)
281288 fi
282289
283- # read the JVM Default Options
290+ # read the JVM Default Options by parsing the :JVMDefaultOptions <dict>
291+ # and pulling all <string> values starting with a dash (-)
284292 JVMDefaultOptions=$( plist_get ' :JVMDefaultOptions' | grep -o " \-.*" | tr -d ' \n' | xargs)
293+ # expand variables $APP_PACKAGE, $APP_ROOT, $JAVAROOT, $USER_HOME (#99)
294+ JVMDefaultOptions=$( eval echo " ${JVMDefaultOptions} " )
285295
286296 # read the Main Arguments from JVMArguments key as an array and retain spaces (see #46 for naming details)
287297 IFS=$' \t\n '
299309fi
300310
301311# read JVM options from file
302- JVMOptionsFile=$( eval echo " ${JVMOptionsFile} " )
303312[ -f $JVMOptionsFile ] && while read -r option; do JVMDefaultOptions+=" $option " ; done <<< $( sed " /^#.*$/d" $JVMOptionsFile )
304313
305314# (#75) check for undefined icons or icon names without .icns extension and prepare
324333stub_logger " [JavaRequirement] JVM minimum version: ${JVMVersion} "
325334stub_logger " [JavaRequirement] JVM maximum version: ${JVMMaxVersion} "
326335
327- # MainArgs: replace occurences of $APP_ROOT with its content
336+ # MainArgs: expand variables $APP_PACKAGE, $APP_ROOT, $JAVAROOT, $USER_HOME
328337MainArgsArr=()
329338for i in " ${MainArgs[@]} "
330339do
331340 MainArgsArr+=(" $( eval echo " $i " ) " )
332341done
333342
334- # JVMOptions: replace occurences of $APP_ROOT with its content
343+ # JVMOptions: expand variables $APP_PACKAGE, $APP_ROOT, $JAVAROOT, $USER_HOME
335344JVMOptionsArr=()
336345for i in " ${JVMOptions[@]} "
337346do
@@ -342,11 +351,34 @@ done
342351# internationalized messages
343352# ###########################################
344353
345- LANG=$( defaults read -g AppleLocale)
346- stub_logger " [Language] $LANG "
354+ # supported languages / available translations
355+ stubLanguages=" ^(fr|de|zh|es|en)-"
356+
357+ # read user preferred languages as defined in macOS System Preferences (#101)
358+ stub_logger ' [LanguageSearch] Checking preferred languages in macOS System Preferences...'
359+ appleLanguages=($( defaults read -g AppleLanguages | grep ' \s"' | tr -d ' ,' | xargs) )
360+ stub_logger " [LanguageSearch] ... found [${appleLanguages[*]} ]"
347361
348- # French localization
349- if [[ $LANG == fr* ]] ; then
362+ language=" "
363+ for i in " ${appleLanguages[@]} "
364+ do
365+ langValue=" ${i% -* } "
366+ if [[ " $i " =~ $stubLanguages ]]; then
367+ stub_logger " [LanguageSearch] ... selected '$i ' ('$langValue ') as the default language for the launcher stub"
368+ language=${langValue}
369+ break
370+ fi
371+ done
372+ if [ -z " ${language} " ]; then
373+ language=" en"
374+ stub_logger " [LanguageSearch] ... selected fallback 'en' as the default language for the launcher stub"
375+ fi
376+ stub_logger " [Language] $language "
377+
378+
379+ case " ${language} " in
380+ # French
381+ fr)
350382 MSG_ERROR_LAUNCHING=" ERREUR au lancement de '${CFBundleName} '."
351383 MSG_MISSING_MAINCLASS=" 'MainClass' n'est pas spécifié.\nL'application Java ne peut pas être lancée."
352384 MSG_JVMVERSION_REQ_INVALID=" La syntaxe de la version de Java demandée est invalide: %s\nVeuillez contacter le développeur de l'application."
@@ -359,9 +391,10 @@ if [[ $LANG == fr* ]] ; then
359391 MSG_LATER=" Plus tard"
360392 MSG_VISIT_JAVA_DOT_COM=" Java by Oracle"
361393 MSG_VISIT_ADOPTOPENJDK=" Java by AdoptOpenJDK"
394+ ;;
362395
363- # German localization
364- elif [[ $LANG == de * ]] ; then
396+ # German
397+ de)
365398 MSG_ERROR_LAUNCHING=" FEHLER beim Starten von '${CFBundleName} '."
366399 MSG_MISSING_MAINCLASS=" Die 'MainClass' ist nicht spezifiziert!\nDie Java-Anwendung kann nicht gestartet werden!"
367400 MSG_JVMVERSION_REQ_INVALID=" Die Syntax der angeforderten Java-Version ist ungültig: %s\nBitte kontaktieren Sie den Entwickler der App."
@@ -374,9 +407,10 @@ elif [[ $LANG == de* ]] ; then
374407 MSG_LATER=" Später"
375408 MSG_VISIT_JAVA_DOT_COM=" Java von Oracle"
376409 MSG_VISIT_ADOPTOPENJDK=" Java von AdoptOpenJDK"
410+ ;;
377411
378- # Simplifyed Chinese localization
379- elif [[ $LANG == zh * ]] ; then
412+ # Simplified Chinese
413+ zh)
380414 MSG_ERROR_LAUNCHING=" 无法启动 '${CFBundleName} '."
381415 MSG_MISSING_MAINCLASS=" 没有指定 'MainClass'!\nJava程序无法启动!"
382416 MSG_JVMVERSION_REQ_INVALID=" Java版本参数语法错误: %s\n请联系该应用的开发者。"
@@ -389,9 +423,10 @@ elif [[ $LANG == zh* ]] ; then
389423 MSG_LATER=" 稍后"
390424 MSG_VISIT_JAVA_DOT_COM=" Java by Oracle"
391425 MSG_VISIT_ADOPTOPENJDK=" Java by AdoptOpenJDK"
426+ ;;
392427
393- # Spanish localization
394- elif [[ $LANG == es * ]] ; then
428+ # Spanish
429+ es)
395430 MSG_ERROR_LAUNCHING=" ERROR iniciando '${CFBundleName} '."
396431 MSG_MISSING_MAINCLASS=" ¡'MainClass' no especificada!\n¡La aplicación Java no puede iniciarse!"
397432 MSG_JVMVERSION_REQ_INVALID=" La sintaxis de la versión Java requerida no es válida: %s\nPor favor, contacte con el desarrollador de la aplicación."
@@ -404,9 +439,10 @@ elif [[ $LANG == es* ]] ; then
404439 MSG_LATER=" Más tarde"
405440 MSG_VISIT_JAVA_DOT_COM=" Java de Oracle"
406441 MSG_VISIT_ADOPTOPENJDK=" Java de AdoptOpenJDK"
442+ ;;
407443
408- # English default localization
409- else
444+ # English | default
445+ en| * )
410446 MSG_ERROR_LAUNCHING=" ERROR launching '${CFBundleName} '."
411447 MSG_MISSING_MAINCLASS=" 'MainClass' isn't specified!\nJava application cannot be started!"
412448 MSG_JVMVERSION_REQ_INVALID=" The syntax of the required Java version is invalid: %s\nPlease contact the App developer."
419455 MSG_LATER=" Later"
420456 MSG_VISIT_JAVA_DOT_COM=" Java by Oracle"
421457 MSG_VISIT_ADOPTOPENJDK=" Java by AdoptOpenJDK"
422- fi
458+ ;;
459+ esac
423460
424461
425462
@@ -535,19 +572,27 @@ if [ -n "$JAVA_HOME" ] ; then
535572 if [[ $JAVA_HOME == /* ]] ; then
536573 # if "$JAVA_HOME" starts with a Slash it's an absolute path
537574 JAVACMD=" $JAVA_HOME /bin/java"
575+ stub_logger " [JavaSearch] ... parsing JAVA_HOME as absolute path to the executable '$JAVACMD '"
538576 else
539577 # otherwise it's a relative path to "$AppPackageFolder"
540578 JAVACMD=" $AppPackageFolder /$JAVA_HOME /bin/java"
579+ stub_logger " [JavaSearch] ... parsing JAVA_HOME as relative path inside the App bundle to the executable '$JAVACMD '"
541580 fi
542581 JAVACMD_version=$( get_comparable_java_version $( get_java_version_from_cmd " ${JAVACMD} " ) )
543582else
544- stub_logger " [JavaSearch] ... didn 't found JAVA_HOME"
583+ stub_logger " [JavaSearch] ... haven 't found JAVA_HOME"
545584fi
546585
547586
548587# check for any other or a specific Java version
549588# also if $JAVA_HOME exists but isn't executable
550589if [ -z " ${JAVACMD} " ] || [ ! -x " ${JAVACMD} " ] ; then
590+
591+ # add a warning in the syslog if JAVA_HOME is not executable or not found (#100)
592+ if [ -n " $JAVA_HOME " ] ; then
593+ stub_logger " [JavaSearch] ... but no 'java' executable was found at the JAVA_HOME location!"
594+ fi
595+
551596 stub_logger " [JavaSearch] Searching for JavaVirtualMachines on the system ..."
552597 # reset variables
553598 JAVACMD=" "
@@ -584,15 +629,18 @@ if [ -z "${JAVACMD}" ] || [ ! -x "${JAVACMD}" ] ; then
584629 javaCounter=$( /usr/libexec/PlistBuddy -c " Print" /dev/stdin <<< $javaXml | grep " Dict" | wc -l | tr -d ' ' )
585630
586631 # iterate over all Dict entries
587- for idx in $( seq 0 $(( javaCounter - 1 )) )
588- do
589- version=$( /usr/libexec/PlistBuddy -c " print :$idx :JVMVersion" /dev/stdin <<< $javaXml )
590- path=$( /usr/libexec/PlistBuddy -c " print :$idx :JVMHomePath" /dev/stdin <<< $javaXml )
591- path+=" /bin/java"
592- allJVMs+=(" $version :$path " )
593- done
594- # unset for loop variables
595- unset version path
632+ # but only if there are any JVMs at all (#93)
633+ if [ " $javaCounter " -gt " 0" ] ; then
634+ for idx in $( seq 0 $(( javaCounter - 1 )) )
635+ do
636+ version=$( /usr/libexec/PlistBuddy -c " print :$idx :JVMVersion" /dev/stdin <<< $javaXml )
637+ path=$( /usr/libexec/PlistBuddy -c " print :$idx :JVMHomePath" /dev/stdin <<< $javaXml )
638+ path+=" /bin/java"
639+ allJVMs+=(" $version :$path " )
640+ done
641+ # unset for loop variables
642+ unset version path
643+ fi
596644
597645 # add SDKMAN! java versions (#95)
598646 if [ -d ~ /.sdkman/candidates/java/ ] ; then
825873cd " ${WorkingDirectory} " || exit 13
826874stub_logger " [WorkingDirectory] ${WorkingDirectory} "
827875
876+ # invoke bootstrap script
877+ $Bootstrap =$ResourcesFolder /scripts/bootstrap && [ -x " $Bootstrap " ] && $Bootstrap
878+
828879# execute Java and set
829880# - classpath
830881# - splash image
0 commit comments