Skip to content

Commit 8a28f6e

Browse files
Use two JDKs on travis-ci (+8 squashed commits)
1 parent a19b2bf commit 8a28f6e

File tree

3 files changed

+341
-17
lines changed

3 files changed

+341
-17
lines changed

.travis.yml

+7-17
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,6 @@ language: java
44
dist:
55
- trusty
66

7-
before_script:
8-
- if [[ "x$JDK" == *'x9'* ]]; then export MAVEN_SKIP_RC=true; fi
9-
10-
script:
11-
- export JDK8_HOME=$(jdk_switcher home oraclejdk8)
12-
- export JDK11_HOME=/usr/lib/jvm/java-11-oracle
13-
- test -d "${JDK11_HOME}" || export JDK11_HOME=$(jdk_switcher home oraclejdk8)
14-
157
before_cache:
168
# No sense in caching current build artifacts
179
- rm -rf $HOME/.m2/repository/com/zaxxer
@@ -20,18 +12,16 @@ cache:
2012
directories:
2113
- $HOME/.m2/repository
2214

23-
matrix:
24-
fast_finish: true
25-
include:
26-
- jdk: oraclejdk8
27-
- jdk: oraclejdk11
28-
env:
29-
- JDK=11
30-
3115
install: /bin/true
3216

17+
jdk: oraclejdk8
18+
3319
script:
34-
- mvn package -Dmaven.javadoc.skip=true -V -B
20+
- export JAVA8_HOME=$JAVA_HOME
21+
# - jdk_switcher use openjdk11
22+
- export JAVA_HOME=$HOME/openjdk11
23+
- $TRAVIS_BUILD_DIR/install-jdk.sh --feature 11 --target $JAVA_HOME
24+
- mvn package --global-toolchains ./travis-toolchains.xml -Dmaven.javadoc.skip=true -V -B
3525

3626
after_success:
3727
- bash <(curl -s https://codecov.io/bash)

install-jdk.sh

+320
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,320 @@
1+
#!/usr/bin/env bash
2+
3+
#
4+
# Install JDK for Linux and Mac OS
5+
#
6+
# This script determines the most recent early-access build number,
7+
# downloads the JDK archive to the user home directory and extracts
8+
# it there.
9+
#
10+
# Exported environment variables (when sourcing this script)
11+
#
12+
# JAVA_HOME is set to the extracted JDK directory
13+
# PATH is prepended with ${JAVA_HOME}/bin
14+
#
15+
# (C) 2020 Christian Stein
16+
#
17+
# https://github.com/sormuras/bach/blob/master/install-jdk.sh
18+
#
19+
20+
set -o errexit
21+
#set -o nounset # https://github.com/travis-ci/travis-ci/issues/5434
22+
#set -o xtrace
23+
24+
function initialize() {
25+
readonly script_name="$(basename "${BASH_SOURCE[0]}")"
26+
readonly script_version='2020-03-17'
27+
28+
dry=false
29+
silent=false
30+
verbose=false
31+
emit_java_home=false
32+
33+
feature='ea'
34+
license='GPL' # Force GPLv2+CE
35+
os='?'
36+
url='?'
37+
workspace="${HOME}"
38+
target='?'
39+
cacerts=false
40+
}
41+
42+
function usage() {
43+
cat << EOF
44+
Usage: ${script_name} [OPTION]...
45+
Download and extract latest-and-greatest JDK from https://jdk.java.net
46+
47+
Version: ${script_version}
48+
Options:
49+
-h|--help Displays this help
50+
-d|--dry-run Activates dry-run mode
51+
-s|--silent Displays no output
52+
-e|--emit-java-home Print value of "JAVA_HOME" to stdout (ignores silent mode)
53+
-v|--verbose Displays verbose output
54+
55+
-f|--feature 11|12|...|ea JDK feature release number, defaults to "ea"
56+
-o|--os linux-x64|osx-x64 Operating system identifier
57+
-u|--url "https://..." Use custom JDK archive (provided as .tar.gz file)
58+
-w|--workspace PATH Working directory defaults to \${HOME} [${HOME}]
59+
-t|--target PATH Target directory, defaults to first component of the tarball
60+
-c|--cacerts Link system CA certificates (currently only Debian/Ubuntu is supported)
61+
EOF
62+
}
63+
64+
function script_exit() {
65+
if [[ $# -eq 1 ]]; then
66+
printf '%s\n' "$1"
67+
exit 0
68+
fi
69+
70+
if [[ $# -eq 2 && $2 =~ ^[0-9]+$ ]]; then
71+
printf '%b\n' "$1"
72+
exit "$2"
73+
fi
74+
75+
script_exit 'Invalid arguments passed to script_exit()!' 2
76+
}
77+
78+
function say() {
79+
if [[ ${silent} != true ]]; then
80+
echo "$@"
81+
fi
82+
}
83+
84+
function verbose() {
85+
if [[ ${verbose} == true ]]; then
86+
echo "$@"
87+
fi
88+
}
89+
90+
function parse_options() {
91+
local option
92+
while [[ $# -gt 0 ]]; do
93+
option="$1"
94+
shift
95+
case ${option} in
96+
-h|-H|--help)
97+
usage
98+
exit 0
99+
;;
100+
-v|-V|--verbose)
101+
verbose=true
102+
;;
103+
-s|-S|--silent)
104+
silent=true
105+
verbose "Silent mode activated"
106+
;;
107+
-d|-D|--dry-run)
108+
dry=true
109+
verbose "Dry-run mode activated"
110+
;;
111+
-e|-E|--emit-java-home)
112+
emit_java_home=true
113+
verbose "Emitting JAVA_HOME"
114+
;;
115+
-f|-F|--feature)
116+
feature="$1"
117+
verbose "feature=${feature}"
118+
shift
119+
;;
120+
-l|-L|--license)
121+
# license="$1"
122+
say "Ignoring license option: $1 -- using GPLv2+CE by default"
123+
verbose "license=${license}"
124+
shift
125+
;;
126+
-o|-O|--os)
127+
os="$1"
128+
verbose "os=${os}"
129+
shift
130+
;;
131+
-u|-U|--url)
132+
url="$1"
133+
verbose "url=${url}"
134+
shift
135+
;;
136+
-w|-W|--workspace)
137+
workspace="$1"
138+
verbose "workspace=${workspace}"
139+
shift
140+
;;
141+
-t|-T|--target)
142+
target="$1"
143+
verbose "target=${target}"
144+
shift
145+
;;
146+
-c|-C|--cacerts)
147+
cacerts=true
148+
verbose "Linking system CA certificates"
149+
;;
150+
*)
151+
script_exit "Invalid argument was provided: ${option}" 2
152+
;;
153+
esac
154+
done
155+
}
156+
157+
function determine_latest_jdk() {
158+
local number
159+
local curl_result
160+
local url
161+
162+
number=15
163+
verbose "Determine latest JDK feature release number, starting with ${number}"
164+
while [[ ${number} != 99 ]]
165+
do
166+
url="https://jdk.java.net/${number}"
167+
curl_result=$(curl -o /dev/null --silent --head --write-out %{http_code} ${url})
168+
if [[ ${curl_result} -ge 400 ]]; then
169+
break
170+
fi
171+
verbose " Found ${url} [${curl_result}]"
172+
latest_jdk=${number}
173+
number=$[$number +1]
174+
done
175+
176+
verbose "Latest JDK feature release number is: ${latest_jdk}"
177+
}
178+
179+
function perform_sanity_checks() {
180+
if [[ ${feature} == '?' ]] || [[ ${feature} == 'ea' ]]; then
181+
feature=${latest_jdk}
182+
fi
183+
if [[ ${feature} -lt 9 ]] || [[ ${feature} -gt ${latest_jdk} ]]; then
184+
script_exit "Expected feature release number in range of 9 to ${latest_jdk}, but got: ${feature}" 3
185+
fi
186+
if [[ -d "$target" ]]; then
187+
script_exit "Target directory must not exist, but it does: $(du -hs '${target}')" 3
188+
fi
189+
}
190+
191+
function determine_url() {
192+
local JAVA_NET="https://jdk.java.net/${feature}"
193+
local DOWNLOAD='https://download.java.net/java'
194+
195+
# An official GA build or an archived feature? Use predefined URL
196+
case "${feature}" in
197+
9) url="${DOWNLOAD}/GA/jdk9/9.0.4/binaries/openjdk-9.0.4_${os}_bin.tar.gz"; return;;
198+
10) url="${DOWNLOAD}/GA/jdk10/10.0.2/19aef61b38124481863b1413dce1855f/13/openjdk-10.0.2_${os}_bin.tar.gz"; return;;
199+
11) url="${DOWNLOAD}/GA/jdk11/9/GPL/openjdk-11.0.2_${os}_bin.tar.gz"; return;;
200+
12) url="${DOWNLOAD}/GA/jdk12.0.2/e482c34c86bd4bf8b56c0b35558996b9/10/GPL/openjdk-12.0.2_${os}_bin.tar.gz"; return;;
201+
13) url="${DOWNLOAD}/GA/jdk13.0.2/d4173c853231432d94f001e99d882ca7/8/GPL/openjdk-13.0.2_${os}_bin.tar.gz"; return;;
202+
14) url="${DOWNLOAD}/GA/jdk14/076bab302c7b4508975440c56f6cc26a/36/GPL/openjdk-14_${os}_bin.tar.gz"; return;;
203+
# 15) is still available from its EA/RC location determined below
204+
esac
205+
206+
# EA or RC build? Grab URL from HTML source of jdk.java.net/${feature}
207+
local candidates=$(wget --quiet --output-document - ${JAVA_NET} | grep -Eo 'href[[:space:]]*=[[:space:]]*"[^\"]+"' | grep -Eo '(http|https)://[^"]+')
208+
url=$(echo "${candidates}" | grep -Eo "${DOWNLOAD}/.+/jdk${feature}/.*${license}/.*jdk-${feature}.+${os}_bin(.tar.gz|.zip)$" || true)
209+
210+
if [[ -z ${url} ]]; then
211+
script_exit "Couldn't determine a download url for ${feature}-${license} on ${os}" 1
212+
fi
213+
}
214+
215+
function prepare_variables() {
216+
if [[ ${os} == '?' ]]; then
217+
if [[ "$OSTYPE" == "darwin"* ]]; then
218+
os='osx-x64'
219+
else
220+
os='linux-x64'
221+
fi
222+
fi
223+
if [[ ${url} == '?' ]]; then
224+
determine_latest_jdk
225+
perform_sanity_checks
226+
determine_url
227+
else
228+
feature='<overridden by custom url>'
229+
license='<overridden by custom url>'
230+
os='<overridden by custom url>'
231+
fi
232+
status=$(curl -o /dev/null --silent --head --write-out %{http_code} ${url})
233+
}
234+
235+
function print_variables() {
236+
cat << EOF
237+
Variables:
238+
feature = ${feature}
239+
os = ${os}
240+
url = ${url}
241+
status = ${status}
242+
EOF
243+
}
244+
245+
function download_and_extract_and_set_target() {
246+
local quiet='--quiet'; if [[ ${verbose} == true ]]; then quiet=''; fi
247+
local local="--directory-prefix ${workspace} --output-document=jdk.tar.gz"
248+
local remote='--timestamping --continue'
249+
local wget_options="${quiet} ${local} ${remote}"
250+
local tar_options="--file jdk.tar.gz"
251+
252+
say "Downloading JDK from ${url}..."
253+
verbose "Using wget options: ${wget_options}"
254+
wget ${wget_options} ${url}
255+
256+
if [[ ${os} == 'windows-x64' ]]; then
257+
script_exit "Extracting archives on Windows isn't supported, yet" 4
258+
fi
259+
260+
verbose "Using tar options: ${tar_options}"
261+
if [[ ${target} == '?' ]]; then
262+
tar --extract ${tar_options} -C "${workspace}"
263+
if [[ "$OSTYPE" != "darwin"* ]]; then
264+
target="${workspace}"/$(tar --list ${tar_options} | grep 'bin/javac' | tr '/' '\n' | tail -3 | head -1)
265+
else
266+
target="${workspace}"/$(tar --list ${tar_options} | head -2 | tail -1 | cut -f 2 -d '/' -)/Contents/Home
267+
fi
268+
verbose "Set target to: ${target}"
269+
else
270+
echo "Using custom target: ${target}"
271+
if [[ "$OSTYPE" != "darwin"* ]]; then
272+
mkdir --parents "${target}"
273+
tar --extract ${tar_options} -C "${target}" --strip-components=1
274+
else
275+
mkdir -p "${target}"
276+
tar --extract ${tar_options} -C "${target}" --strip-components=4
277+
fi
278+
fi
279+
280+
if [[ ${verbose} == true ]]; then
281+
echo "Content of target directory:"
282+
ls "${target}"
283+
echo "Content of release file:"
284+
[[ ! -f "${target}/release" ]] || cat "${target}/release"
285+
fi
286+
287+
# Link to system certificates
288+
# https://openjdk.java.net/jeps/319
289+
# https://bugs.openjdk.java.net/browse/JDK-8196141
290+
if [[ ${cacerts} == true ]]; then
291+
local directory="${target}/lib/security/cacerts"
292+
if [[ -f "${directory}" ]]; then
293+
mv "${directory}" "${directory}.jdk"
294+
ln -s /etc/ssl/certs/java/cacerts "${directory}"
295+
else
296+
verbose "Directory ${directory} doesn't exist, didn't link system CA certificates."
297+
fi
298+
fi
299+
}
300+
301+
function main() {
302+
initialize
303+
parse_options "$@"
304+
305+
say "$script_name $script_version"
306+
prepare_variables
307+
308+
if [[ ${silent} == false ]]; then print_variables; fi
309+
if [[ ${dry} == true ]]; then exit 0; fi
310+
311+
download_and_extract_and_set_target
312+
313+
export JAVA_HOME=$(cd "${target}"; pwd)
314+
export PATH=${JAVA_HOME}/bin:$PATH
315+
316+
if [[ ${silent} == false ]]; then java -Xmx100m -version; fi
317+
if [[ ${emit_java_home} == true ]]; then echo "${JAVA_HOME}"; fi
318+
}
319+
320+
main "$@"

travis-toolchains.xml

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="UTF8"?>
2+
<toolchains>
3+
<toolchain>
4+
<type>paths</type>
5+
<provides>
6+
<id>java</id>
7+
</provides>
8+
<configuration>
9+
<paths>
10+
<path>/usr/lib/jvm/java-8-oracle/bin</path>
11+
</paths>
12+
</configuration>
13+
</toolchain>
14+
</toolchains>

0 commit comments

Comments
 (0)