Skip to content
This repository was archived by the owner on Feb 4, 2023. It is now read-only.

Commit 9da7364

Browse files
committed
Better search algorithm for specified Java version & switch to /bin/bash // refs #35
since the bash on Mac OS X is v3 and cannot `declare -A` an associative key/value array, the approach for finding the highest matching java version is to first check `/usr/libexec/java_home -v XXX` and use this (because it always returns the latest matching java version) and only if the Oracle or Apple JRE plugins contain an even higher matching java version, this will be used. tests are passing with setup as described in #35
1 parent 23bb5e2 commit 9da7364

File tree

2 files changed

+88
-33
lines changed

2 files changed

+88
-33
lines changed

src/universalJavaApplicationStub

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!/bin/sh
1+
#!/bin/bash
22
##################################################################################
33
# #
44
# universalJavaApplicationStub #
@@ -13,7 +13,7 @@
1313
# #
1414
# @author Tobias Fischer #
1515
# @url https://github.com/tofi86/universalJavaApplicationStub #
16-
# @date 2016-08-26 #
16+
# @date 2016-08-27 #
1717
# @version 1.0.1 #
1818
# #
1919
# #
@@ -22,7 +22,7 @@
2222
# #
2323
# The MIT License (MIT) #
2424
# #
25-
# Copyright (c) 2015 Tobias Fischer #
25+
# Copyright (c) 2016 Tobias Fischer #
2626
# #
2727
# Permission is hereby granted, free of charge, to any person obtaining a copy #
2828
# of this software and associated documentation files (the "Software"), to deal #
@@ -279,19 +279,26 @@ fi
279279

280280

281281

282-
#
283-
# function: extract Java major version
282+
# helper
283+
# function: extract Java version string
284284
# from java -version command
285285
############################################
286286

287-
function extractJavaMajorVersion() {
288-
"$1" -version
289-
echo `"$1" -version 2>&1 | awk '/version/{print $NF}' | sed -E 's/"([0-9.]{3})[0-9_.]{5,6}"/\1/g'`
287+
function extractJavaVersionString() {
288+
echo `"$1" -version 2>&1 | awk '/version/{print $NF}' | sed -E 's/"//g'`
290289
}
291290

291+
# helper
292+
# function: extract Java major version
293+
# from java version string
294+
############################################
292295

296+
function extractJavaMajorVersion() {
297+
version_str=$(extractJavaVersionString "$1")
298+
echo ${version_str} | sed -E 's/([0-9.]{3})[0-9_.]{5,6}/\1/g'
299+
}
293300

294-
#
301+
# helper
295302
# function: generate comparable Java version
296303
# number from java version string
297304
############################################
@@ -304,6 +311,8 @@ function comparableJavaVersionNumber() {
304311

305312
#
306313
# function: Java version tester
314+
# check whether a given java version
315+
# satisfies the given requirement
307316
############################################
308317

309318
function JavaVersionSatisfiesRequirement() {
@@ -359,22 +368,36 @@ oracle_jre_version=`extractJavaMajorVersion "${oracle_jre_plugin}"`
359368
if [ -n "$JAVA_HOME" ] ; then
360369
JAVACMD="$JAVA_HOME/bin/java"
361370

362-
# check for JVMversion requirements
371+
# check for a specific Java version, specified in JVMversion Plist key
363372
elif [ ! -z ${JVMVersion} ] ; then
364373

365-
# first in "/usr/libexec/java_home" symlinks
366-
if [ -x /usr/libexec/java_home ] && /usr/libexec/java_home -F -v ${JVMVersion} > /dev/null ; then
374+
# first check "/usr/libexec/java_home" symlinks
375+
if [ -x /usr/libexec/java_home ] && /usr/libexec/java_home -F -v ${JVMVersion} > /dev/null 2>&1 ; then
367376
JAVACMD="`/usr/libexec/java_home -F -v ${JVMVersion} 2> /dev/null`/bin/java"
377+
JAVACMD_version=$(comparableJavaVersionNumber $(extractJavaVersionString "${JAVACMD}"))
378+
fi
368379

369-
# then in Oracle JRE plugin
370-
elif [ -x "${oracle_jre_plugin}" ] && JavaVersionSatisfiesRequirement ${oracle_jre_version} ${JVMVersion} ; then
371-
JAVACMD="${oracle_jre_plugin}"
380+
# then additionally check the Oracle JRE plugin whether it's a higher/newer compatible version
381+
if [ -x "${oracle_jre_plugin}" ] && JavaVersionSatisfiesRequirement ${oracle_jre_version} ${JVMVersion} ; then
382+
this_java_ver=$(comparableJavaVersionNumber $(extractJavaVersionString "${oracle_jre_plugin}"))
383+
# use this compatible version only if the above returned empty or if the version number is higher
384+
if [ -z ${JAVACMD} ] || [ ${this_java_ver} -ge ${JAVACMD_version} ] ; then
385+
JAVACMD="${oracle_jre_plugin}"
386+
JAVACMD_version=${this_java_ver}
387+
fi
388+
fi
372389

373-
# then in Apple JRE plugin
374-
elif [ -x "${apple_jre_plugin}" ] && JavaVersionSatisfiesRequirement ${apple_jre_version} ${JVMVersion} ; then
375-
JAVACMD="${apple_jre_plugin}"
390+
# then additionally check the Apple JRE plugin whether it's a higher/newer compatible version
391+
if [ -x "${apple_jre_plugin}" ] && JavaVersionSatisfiesRequirement ${apple_jre_version} ${JVMVersion} ; then
392+
this_java_ver=$(comparableJavaVersionNumber $(extractJavaVersionString "${apple_jre_plugin}"))
393+
# use this compatible version only if the above returned empty or if the version number is higher
394+
if [ -z ${JAVACMD} ] || [ ${this_java_ver} -ge ${JAVACMD_version} ] ; then
395+
JAVACMD="${apple_jre_plugin}"
396+
JAVACMD_version=${this_java_ver}
397+
fi
398+
fi
376399

377-
else
400+
if [ -z "$JAVACMD" ] ; then
378401
# display human readable java version (#28)
379402
java_version_hr=`echo ${JVMVersion} | sed -E 's/[0-9]\.([0-9+*]+)/ \1/g' | sed "s/+/ ${MSG_JAVA_VERSION_OR_LATER}/" | sed "s/*/ ${MSG_JAVA_VERSION_LATEST}/"`
380403
# display error message with applescript

test/java-version-tester.sh

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,50 @@
1-
#!/bin/sh
1+
#!/bin/bash
22

33
# Java JRE version tester
4-
# tofi86 @ 2015-09-29
4+
# tofi86 @ 2016-08-27
5+
6+
7+
8+
# helper
9+
# function: extract Java version string
10+
# from java -version command
11+
############################################
12+
13+
function extractJavaVersionString() {
14+
echo `"$1" -version 2>&1 | awk '/version/{print $NF}' | sed -E 's/"//g'`
15+
}
16+
17+
# helper
18+
# function: extract Java major version
19+
# from java version string
20+
############################################
21+
22+
function extractJavaMajorVersion() {
23+
version_str=$(extractJavaVersionString "$1")
24+
echo ${version_str} | sed -E 's/([0-9.]{3})[0-9_.]{5,6}/\1/g'
25+
}
26+
27+
# helper
28+
# function: generate comparable Java version
29+
# number from java version string
30+
############################################
31+
32+
function comparableJavaVersionNumber() {
33+
echo $1 | sed -E 's/[[:punct:]]//g'
34+
}
35+
36+
37+
38+
#
39+
# function: Java version tester
40+
# check whether a given java version
41+
# satisfies the given requirement
42+
############################################
543

644
function JavaVersionSatisfiesRequirement() {
745
java_ver=$1
846
java_req=$2
9-
47+
1048
# e.g. 1.8*
1149
if [[ ${java_req} =~ ^[0-9]\.[0-9]\*$ ]] ; then
1250
java_req_num=${java_req:0:3}
@@ -16,38 +54,32 @@ function JavaVersionSatisfiesRequirement() {
1654
else
1755
return 1
1856
fi
19-
57+
2058
# e.g. 1.8+
2159
elif [[ ${java_req} =~ ^[0-9]\.[0-9]\+$ ]] ; then
22-
java_req_num=`echo ${java_req} | sed -E 's/[[:punct:]]//g'`
23-
java_ver_num=`echo ${java_ver} | sed -E 's/[[:punct:]]//g'`
60+
java_req_num=$(comparableJavaVersionNumber ${java_req})
61+
java_ver_num=$(comparableJavaVersionNumber ${java_ver})
2462
if [ ${java_ver_num} -ge ${java_req_num} ] ; then
2563
return 0
2664
else
2765
return 1
2866
fi
29-
67+
3068
# e.g. 1.8
3169
elif [[ ${java_req} =~ ^[0-9]\.[0-9]$ ]] ; then
3270
if [ ${java_ver} == ${java_req} ] ; then
3371
return 0
3472
else
3573
return 1
3674
fi
37-
75+
3876
# not matching any of the above patterns
3977
else
4078
return 2
4179
fi
4280
}
4381

4482

45-
function extractJavaMajorVersion() {
46-
echo `"$1" -version 2>&1 | awk '/version/{print $NF}' | sed -E 's/"([0-9.]{3})[0-9_.]{5}"/\1/g'`
47-
}
48-
49-
50-
5183
apple_jre_plugin="/Library/Java/Home/bin/java"
5284
apple_jre_version=`extractJavaMajorVersion "${apple_jre_plugin}"`
5385
oracle_jre_plugin="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"

0 commit comments

Comments
 (0)