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
166166JavaFolder=" ${AppleJavaFolder} "
167167ResourcesFolder=" ${AppleResourcesFolder} "
168168
169+ # set expandable variables
170+ APP_ROOT=" ${AppPackageFolder} "
169171APP_PACKAGE=" ${AppPackageFolder} "
170172JAVAROOT=" ${AppleJavaFolder} "
171173USER_HOME=" $HOME "
@@ -180,7 +182,7 @@ if [ $exitcode -eq 0 ]; then
180182# AppPackageRoot is the standard WorkingDirectory when the script is started
181183WorkingDirectory=" ${AppPackageRoot} "
182184fi
183- # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
185+ # expand variables $APP_PACKAGE, $APP_ROOT, $ JAVAROOT, $USER_HOME
184186WorkingDirectory=$( eval echo " ${WorkingDirectory} " )
185187
186188
@@ -203,7 +205,7 @@ if [ $exitcode -eq 0 ]; then
203205else
204206JVMClassPath=${JVMClassPath_RAW}
205207fi
206- # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
208+ # expand variables $APP_PACKAGE, $APP_ROOT, $ JAVAROOT, $USER_HOME
207209JVMClassPath=$( eval echo " ${JVMClassPath} " )
208210
209211# read the JVM Options in either Array or String style
@@ -213,7 +215,7 @@ if [ $exitcode -eq 0 ]; then
213215else
214216JVMDefaultOptions=${JVMDefaultOptions_RAW}
215217fi
216- # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME (#84)
218+ # expand variables $APP_PACKAGE, $APP_ROOT, $ JAVAROOT, $USER_HOME (#84)
217219JVMDefaultOptions=$( eval echo " ${JVMDefaultOptions} " )
218220
219221# read StartOnMainThread and add as -XstartOnFirstThread
@@ -247,7 +249,11 @@ else
247249ResourcesFolder=" ${OracleResourcesFolder} "
248250WorkingDirectory=" ${OracleJavaFolder} "
249251
252+ # set expandable variables
250253APP_ROOT=" ${AppPackageFolder} "
254+ APP_PACKAGE=" ${AppPackageFolder} "
255+ JAVAROOT=" ${OracleJavaFolder} "
256+ USER_HOME=" $HOME "
251257
252258# read the MainClass name
253259JVMMainClass=" $( plist_get ' :JVMMainClassName' ) "
@@ -265,12 +271,12 @@ else
265271JVMClassPath_RAW=$( plist_get ' :JVMClassPath' )
266272if [[ $JVMClassPath_RAW == * Array* ]] ; then
267273JVMClassPath=.$( plist_get ' :JVMClassPath' | grep " " | sed ' s/^ */:/g' | tr -d ' \n' | xargs)
268- # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
274+ # expand variables $APP_PACKAGE, $APP_ROOT, $ JAVAROOT, $USER_HOME
269275JVMClassPath=$( eval echo " ${JVMClassPath} " )
270276
271277elif [[ ! -z ${JVMClassPath_RAW} ]] ; then
272278JVMClassPath=${JVMClassPath_RAW}
273- # expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOME
279+ # expand variables $APP_PACKAGE, $APP_ROOT, $ JAVAROOT, $USER_HOME
274280JVMClassPath=$( eval echo " ${JVMClassPath} " )
275281
276282else
@@ -279,8 +285,11 @@ else
279285# Do NOT expand the default 'AppName.app/Contents/Java/*' classpath (#42)
280286fi
281287
282- # read the JVM Default Options
288+ # read the JVM Default Options by parsing the :JVMDefaultOptions <dict>
289+ # and pulling all <string> values starting with a dash (-)
283290JVMDefaultOptions=$( plist_get ' :JVMDefaultOptions' | grep -o " \-.*" | tr -d ' \n' | xargs)
291+ # expand variables $APP_PACKAGE, $APP_ROOT, $JAVAROOT, $USER_HOME (#99)
292+ JVMDefaultOptions=$( eval echo " ${JVMDefaultOptions} " )
284293
285294# read the Main Arguments from JVMArguments key as an array and retain spaces (see #46 for naming details)
286295IFS=$' \t\n '
316325stub_logger " [JavaRequirement] JVM minimum version: ${JVMVersion} "
317326stub_logger " [JavaRequirement] JVM maximum version: ${JVMMaxVersion} "
318327
319- # MainArgs: replace occurences of $APP_ROOT with its content
328+ # MainArgs: expand variables $APP_PACKAGE, $APP_ROOT, $JAVAROOT, $USER_HOME
320329MainArgsArr=()
321330for i in " ${MainArgs[@]} "
322331do
323332MainArgsArr+=(" $( eval echo " $i " ) " )
324333done
325334
326- # JVMOptions: replace occurences of $APP_ROOT with its content
335+ # JVMOptions: expand variables $APP_PACKAGE, $APP_ROOT, $JAVAROOT, $USER_HOME
327336JVMOptionsArr=()
328337for i in " ${JVMOptions[@]} "
329338do
@@ -334,11 +343,34 @@ done
334343# internationalized messages
335344# ###########################################
336345
337- LANG=$( defaults read -g AppleLocale)
338- stub_logger " [Language] $LANG "
346+ # supported languages / available translations
347+ stubLanguages=" ^(fr|de|zh|es|en)-"
348+
349+ # read user preferred languages as defined in macOS System Preferences (#101)
350+ stub_logger ' [LanguageSearch] Checking preferred languages in macOS System Preferences...'
351+ appleLanguages=($( defaults read -g AppleLanguages | grep ' \s"' | tr -d ' ,' | xargs) )
352+ stub_logger " [LanguageSearch] ... found [${appleLanguages[*]} ]"
353+
354+ language=" "
355+ for i in " ${appleLanguages[@]} "
356+ do
357+ langValue=" ${i% -* } "
358+ if [[ " $i " =~ $stubLanguages ]]; then
359+ stub_logger " [LanguageSearch] ... selected '$i ' ('$langValue ') as the default language for the launcher stub"
360+ language=${langValue}
361+ break
362+ fi
363+ done
364+ if [ -z " ${language} " ]; then
365+ language=" en"
366+ stub_logger " [LanguageSearch] ... selected fallback 'en' as the default language for the launcher stub"
367+ fi
368+ stub_logger " [Language] $language "
369+
339370
340- # French localization
341- if [[ $LANG == fr* ]] ; then
371+ case " ${language} " in
372+ # French
373+ fr)
342374MSG_ERROR_LAUNCHING=" ERREUR au lancement de '${CFBundleName} '."
343375MSG_MISSING_MAINCLASS=" 'MainClass' n'est pas spécifié.\nL'application Java ne peut pas être lancée."
344376MSG_JVMVERSION_REQ_INVALID=" La syntaxe de la version de Java demandée est invalide: %s\nVeuillez contacter le développeur de l'application."
@@ -351,9 +383,10 @@ if [[ $LANG == fr* ]] ; then
351383MSG_LATER=" Plus tard"
352384MSG_VISIT_JAVA_DOT_COM=" Java by Oracle"
353385MSG_VISIT_ADOPTOPENJDK=" Java by AdoptOpenJDK"
386+ ;;
354387
355- # German localization
356- elif [[ $LANG == de * ]] ; then
388+ # German
389+ de)
357390MSG_ERROR_LAUNCHING=" FEHLER beim Starten von '${CFBundleName} '."
358391MSG_MISSING_MAINCLASS=" Die 'MainClass' ist nicht spezifiziert!\nDie Java-Anwendung kann nicht gestartet werden!"
359392MSG_JVMVERSION_REQ_INVALID=" Die Syntax der angeforderten Java-Version ist ungültig: %s\nBitte kontaktieren Sie den Entwickler der App."
@@ -366,9 +399,10 @@ elif [[ $LANG == de* ]] ; then
366399MSG_LATER=" Später"
367400MSG_VISIT_JAVA_DOT_COM=" Java von Oracle"
368401MSG_VISIT_ADOPTOPENJDK=" Java von AdoptOpenJDK"
402+ ;;
369403
370- # Simplifyed Chinese localization
371- elif [[ $LANG == zh * ]] ; then
404+ # Simplified Chinese
405+ zh)
372406MSG_ERROR_LAUNCHING=" 无法启动 '${CFBundleName} '."
373407MSG_MISSING_MAINCLASS=" 没有指定 'MainClass'!\nJava程序无法启动!"
374408MSG_JVMVERSION_REQ_INVALID=" Java版本参数语法错误: %s\n请联系该应用的开发者。"
@@ -381,9 +415,10 @@ elif [[ $LANG == zh* ]] ; then
381415MSG_LATER=" 稍后"
382416MSG_VISIT_JAVA_DOT_COM=" Java by Oracle"
383417MSG_VISIT_ADOPTOPENJDK=" Java by AdoptOpenJDK"
418+ ;;
384419
385- # Spanish localization
386- elif [[ $LANG == es * ]] ; then
420+ # Spanish
421+ es)
387422MSG_ERROR_LAUNCHING=" ERROR iniciando '${CFBundleName} '."
388423MSG_MISSING_MAINCLASS=" ¡'MainClass' no especificada!\n¡La aplicación Java no puede iniciarse!"
389424MSG_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."
@@ -396,9 +431,10 @@ elif [[ $LANG == es* ]] ; then
396431MSG_LATER=" Más tarde"
397432MSG_VISIT_JAVA_DOT_COM=" Java de Oracle"
398433MSG_VISIT_ADOPTOPENJDK=" Java de AdoptOpenJDK"
434+ ;;
399435
400- # English default localization
401- else
436+ # English | default
437+ en| * )
402438MSG_ERROR_LAUNCHING=" ERROR launching '${CFBundleName} '."
403439MSG_MISSING_MAINCLASS=" 'MainClass' isn't specified!\nJava application cannot be started!"
404440MSG_JVMVERSION_REQ_INVALID=" The syntax of the required Java version is invalid: %s\nPlease contact the App developer."
411447MSG_LATER=" Later"
412448MSG_VISIT_JAVA_DOT_COM=" Java by Oracle"
413449MSG_VISIT_ADOPTOPENJDK=" Java by AdoptOpenJDK"
414- fi
450+ ;;
451+ esac
415452
416453
417454
@@ -527,19 +564,27 @@ if [ -n "$JAVA_HOME" ] ; then
527564if [[ $JAVA_HOME == /* ]] ; then
528565# if "$JAVA_HOME" starts with a Slash it's an absolute path
529566JAVACMD=" $JAVA_HOME /bin/java"
567+ stub_logger " [JavaSearch] ... parsing JAVA_HOME as absolute path to the executable '$JAVACMD '"
530568else
531569# otherwise it's a relative path to "$AppPackageFolder"
532570JAVACMD=" $AppPackageFolder /$JAVA_HOME /bin/java"
571+ stub_logger " [JavaSearch] ... parsing JAVA_HOME as relative path inside the App bundle to the executable '$JAVACMD '"
533572fi
534573JAVACMD_version=$( get_comparable_java_version $( get_java_version_from_cmd " ${JAVACMD} " ) )
535574else
536- stub_logger " [JavaSearch] ... didn 't found JAVA_HOME"
575+ stub_logger " [JavaSearch] ... haven 't found JAVA_HOME"
537576fi
538577
539578
540579# check for any other or a specific Java version
541580# also if $JAVA_HOME exists but isn't executable
542581if [ -z " ${JAVACMD} " ] || [ ! -x " ${JAVACMD} " ] ; then
582+
583+ # add a warning in the syslog if JAVA_HOME is not executable or not found (#100)
584+ if [ -n " $JAVA_HOME " ] ; then
585+ stub_logger " [JavaSearch] ... but no 'java' executable was found at the JAVA_HOME location!"
586+ fi
587+
543588stub_logger " [JavaSearch] Searching for JavaVirtualMachines on the system ..."
544589# reset variables
545590JAVACMD=" "
@@ -576,15 +621,18 @@ if [ -z "${JAVACMD}" ] || [ ! -x "${JAVACMD}" ] ; then
576621javaCounter=$( /usr/libexec/PlistBuddy -c " Print" /dev/stdin <<< $javaXml | grep " Dict" | wc -l | tr -d ' ' )
577622
578623# iterate over all Dict entries
579- for idx in $( seq 0 $(( javaCounter - 1 )) )
580- do
581- version=$( /usr/libexec/PlistBuddy -c " print :$idx :JVMVersion" /dev/stdin <<< $javaXml )
582- path=$( /usr/libexec/PlistBuddy -c " print :$idx :JVMHomePath" /dev/stdin <<< $javaXml )
583- path+=" /bin/java"
584- allJVMs+=(" $version :$path " )
585- done
586- # unset for loop variables
587- unset version path
624+ # but only if there are any JVMs at all (#93)
625+ if [ " $javaCounter " -gt " 0" ] ; then
626+ for idx in $( seq 0 $(( javaCounter - 1 )) )
627+ do
628+ version=$( /usr/libexec/PlistBuddy -c " print :$idx :JVMVersion" /dev/stdin <<< $javaXml )
629+ path=$( /usr/libexec/PlistBuddy -c " print :$idx :JVMHomePath" /dev/stdin <<< $javaXml )
630+ path+=" /bin/java"
631+ allJVMs+=(" $version :$path " )
632+ done
633+ # unset for loop variables
634+ unset version path
635+ fi
588636
589637# add SDKMAN! java versions (#95)
590638if [ -d ~ /.sdkman/candidates/java/ ] ; then
0 commit comments