Skip to content

Commit 5077a2c

Browse files
[Java] Add JDK 22 support (#1102)
* Add JDK 22 support * bump patch version * removed exit added for debugging * added one condition before changing the JDK_DISTRO * version set to 21 and jdk_distro open fixed * failed test cases fixed * fixing install_type issue if not java * yum update with epel-release install * explicit test case writen to validate jdk 22 works fine * moved check_packages to the start * INSTALL_CMD moved to start * variable changed
1 parent 0be7941 commit 5077a2c

File tree

4 files changed

+108
-83
lines changed

4 files changed

+108
-83
lines changed

src/java/devcontainer-feature.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"id": "java",
3-
"version": "1.6.0",
3+
"version": "1.6.1",
44
"name": "Java (via SDKMAN!)",
55
"documentationURL": "https://github.com/devcontainers/features/tree/main/src/java",
66
"description": "Installs Java, SDKMAN! (if not installed), and needed dependencies.",

src/java/install.sh

Lines changed: 84 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,6 @@ else
5353
exit 1
5454
fi
5555

56-
if [ "${ADJUSTED_ID}" = "rhel" ] && [ "${VERSION_CODENAME-}" = "centos7" ]; then
57-
# As of 1 July 2024, mirrorlist.centos.org no longer exists.
58-
# Update the repo files to reference vault.centos.org.
59-
sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo
60-
sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo
61-
sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo
62-
fi
63-
6456
# Setup INSTALL_CMD & PKG_MGR_CMD
6557
if type apt-get > /dev/null 2>&1; then
6658
PKG_MGR_CMD=apt-get
@@ -79,6 +71,67 @@ else
7971
exit 1
8072
fi
8173

74+
pkg_manager_update() {
75+
case $ADJUSTED_ID in
76+
debian)
77+
if [ "$(find /var/lib/apt/lists/* | wc -l)" = "0" ]; then
78+
echo "Running apt-get update..."
79+
${PKG_MGR_CMD} update -y
80+
fi
81+
;;
82+
rhel)
83+
if [ ${PKG_MGR_CMD} = "microdnf" ]; then
84+
if [ "$(ls /var/cache/yum/* 2>/dev/null | wc -l)" = 0 ]; then
85+
echo "Running ${PKG_MGR_CMD} makecache ..."
86+
${PKG_MGR_CMD} makecache
87+
fi
88+
else
89+
if [ "$(ls /var/cache/${PKG_MGR_CMD}/* 2>/dev/null | wc -l)" = 0 ]; then
90+
echo "Running ${PKG_MGR_CMD} check-update ..."
91+
set +e
92+
stderr_messages=$(${PKG_MGR_CMD} -q check-update 2>&1)
93+
rc=$?
94+
# centos 7 sometimes returns a status of 100 when it apears to work.
95+
if [ $rc != 0 ] && [ $rc != 100 ]; then
96+
echo "(Error) ${PKG_MGR_CMD} check-update produced the following error message(s):"
97+
echo "${stderr_messages}"
98+
exit 1
99+
fi
100+
set -e
101+
fi
102+
fi
103+
;;
104+
esac
105+
}
106+
107+
# Checks if packages are installed and installs them if not
108+
check_packages() {
109+
case ${ADJUSTED_ID} in
110+
debian)
111+
if ! dpkg -s "$@" > /dev/null 2>&1; then
112+
pkg_manager_update
113+
${INSTALL_CMD} "$@"
114+
fi
115+
;;
116+
rhel)
117+
if ! rpm -q "$@" > /dev/null 2>&1; then
118+
pkg_manager_update
119+
${INSTALL_CMD} "$@"
120+
fi
121+
;;
122+
esac
123+
}
124+
125+
if [ "${ADJUSTED_ID}" = "rhel" ] && [ "${VERSION_CODENAME-}" = "centos7" ]; then
126+
# As of 1 July 2024, mirrorlist.centos.org no longer exists.
127+
# Update the repo files to reference vault.centos.org.
128+
sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo
129+
sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo
130+
sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo
131+
yum update -y
132+
check_packages epel-release
133+
fi
134+
82135
# Clean up
83136
clean_up() {
84137
local pkg
@@ -95,7 +148,6 @@ clean_up() {
95148
;;
96149
esac
97150
}
98-
clean_up
99151

100152
# Ensure that login shells get the correct path if the user updated the PATH using ENV.
101153
rm -f /etc/profile.d/00-restore-env.sh
@@ -143,80 +195,33 @@ updaterc() {
143195
fi
144196
}
145197

146-
147-
pkg_manager_update() {
148-
case $ADJUSTED_ID in
149-
debian)
150-
if [ "$(find /var/lib/apt/lists/* | wc -l)" = "0" ]; then
151-
echo "Running apt-get update..."
152-
${PKG_MGR_CMD} update -y
153-
fi
154-
;;
155-
rhel)
156-
if [ ${PKG_MGR_CMD} = "microdnf" ]; then
157-
if [ "$(ls /var/cache/yum/* 2>/dev/null | wc -l)" = 0 ]; then
158-
echo "Running ${PKG_MGR_CMD} makecache ..."
159-
${PKG_MGR_CMD} makecache
160-
fi
161-
else
162-
if [ "$(ls /var/cache/${PKG_MGR_CMD}/* 2>/dev/null | wc -l)" = 0 ]; then
163-
echo "Running ${PKG_MGR_CMD} check-update ..."
164-
set +e
165-
stderr_messages=$(${PKG_MGR_CMD} -q check-update 2>&1)
166-
rc=$?
167-
# centos 7 sometimes returns a status of 100 when it apears to work.
168-
if [ $rc != 0 ] && [ $rc != 100 ]; then
169-
echo "(Error) ${PKG_MGR_CMD} check-update produced the following error message(s):"
170-
echo "${stderr_messages}"
171-
exit 1
172-
fi
173-
set -e
174-
fi
175-
fi
176-
;;
177-
esac
178-
}
179-
180-
# Checks if packages are installed and installs them if not
181-
check_packages() {
182-
case ${ADJUSTED_ID} in
183-
debian)
184-
if ! dpkg -s "$@" > /dev/null 2>&1; then
185-
pkg_manager_update
186-
${INSTALL_CMD} "$@"
187-
fi
188-
;;
189-
rhel)
190-
if ! rpm -q "$@" > /dev/null 2>&1; then
191-
pkg_manager_update
192-
${INSTALL_CMD} "$@"
193-
fi
194-
;;
195-
esac
196-
}
197-
198-
# Use Microsoft JDK for everything but JDK 8 and 18 (unless specified differently with jdkDistro option)
199-
get_jdk_distro() {
200-
VERSION="$1"
201-
if [ "${JDK_DISTRO}" = "ms" ]; then
202-
if echo "${VERSION}" | grep -E '^8([\s\.]|$)' > /dev/null 2>&1 || echo "${VERSION}" | grep -E '^18([\s\.]|$)' > /dev/null 2>&1; then
203-
JDK_DISTRO="tem"
204-
fi
205-
fi
206-
}
207-
208198
find_version_list() {
209199
prefix="$1"
210200
suffix="$2"
211201
install_type=$3
212202
ifLts="$4"
213203
version_list=$5
204+
java_ver=$6
205+
206+
check_packages jq
207+
all_versions=$(curl -s https://api.adoptium.net/v3/info/available_releases)
214208
if [ "${ifLts}" = "true" ]; then
215-
all_lts_versions=$(curl -s https://api.adoptium.net/v3/info/available_releases)
216-
major_version=$(echo "$all_lts_versions" | jq -r '.most_recent_lts')
217-
regex="${prefix}\\K${major_version}\\.?[0-9]*\\.?[0-9]*${suffix}"
218-
else
209+
major_version=$(echo "$all_versions" | jq -r '.most_recent_lts')
210+
elif [ "${java_ver}" = "latest" ]; then
211+
major_version=$(echo "$all_versions" | jq -r '.most_recent_feature_release')
212+
else
213+
major_version=$(echo "$java_ver" | cut -d '.' -f 1)
214+
fi
215+
216+
if [ "${JDK_DISTRO}" = "ms" ]; then
217+
if [ "${major_version}" = "8" ] || [ "${major_version}" = "18" ] || [ "${major_version}" = "22" ]; then
218+
JDK_DISTRO="tem"
219+
fi
220+
fi
221+
if [ "${install_type}" != "java" ]; then
219222
regex="${prefix}\\K[0-9]+\\.?[0-9]*\\.?[0-9]*${suffix}"
223+
else
224+
regex="${prefix}\\K${major_version}\\.?[0-9]*\\.?[0-9]*${suffix}${JDK_DISTRO}\\s*"
220225
fi
221226
declare -g ${version_list}="$(su ${USERNAME} -c ". \${SDKMAN_DIR}/bin/sdkman-init.sh && sdk list ${install_type} 2>&1 | grep -oP \"${regex}\" | tr -d ' ' | sort -rV")"
222227
}
@@ -237,13 +242,12 @@ sdk_install() {
237242
elif [[ "${pkg_vals}" =~ "${install_type}" ]] && [ "${requested_version}" = "latest" ]; then
238243
requested_version=""
239244
elif [ "${requested_version}" = "lts" ]; then
240-
check_packages jq
241-
find_version_list "$prefix" "$suffix" "$install_type" "true" version_list
245+
find_version_list "$prefix" "$suffix" "$install_type" "true" version_list "${requested_version}"
242246
requested_version="$(echo "${version_list}" | head -n 1)"
243247
elif echo "${requested_version}" | grep -oE "${full_version_check}" > /dev/null 2>&1; then
244248
echo "${requested_version}"
245249
else
246-
find_version_list "$prefix" "$suffix" "$install_type" "false" version_list
250+
find_version_list "$prefix" "$suffix" "$install_type" "false" version_list "${requested_version}"
247251
if [ "${requested_version}" = "latest" ] || [ "${requested_version}" = "current" ]; then
248252
requested_version="$(echo "${version_list}" | head -n 1)"
249253
else
@@ -301,17 +305,15 @@ if [ ! -d "${SDKMAN_DIR}" ]; then
301305
updaterc "export SDKMAN_DIR=${SDKMAN_DIR}\n. \${SDKMAN_DIR}/bin/sdkman-init.sh"
302306
fi
303307

304-
get_jdk_distro ${JAVA_VERSION}
305-
sdk_install java ${JAVA_VERSION} "\\s*" "(\\.[a-z0-9]+)*-${JDK_DISTRO}\\s*" ".*-[a-z]+$" "true"
308+
sdk_install java ${JAVA_VERSION} "\\s*" "(\\.[a-z0-9]+)*-" ".*-[a-z]+$" "true"
306309

307310
# Additional java versions to be installed but not be set as default.
308311
if [ ! -z "${ADDITIONAL_VERSIONS}" ]; then
309312
OLDIFS=$IFS
310313
IFS=","
311314
read -a additional_versions <<< "$ADDITIONAL_VERSIONS"
312315
for version in "${additional_versions[@]}"; do
313-
get_jdk_distro ${version}
314-
sdk_install java ${version} "\\s*" "(\\.[a-z0-9]+)*-${JDK_DISTRO}\\s*" ".*-[a-z]+$" "false"
316+
sdk_install java ${version} "\\s*" "(\\.[a-z0-9]+)*-" ".*-[a-z]+$" "false"
315317
done
316318
IFS=$OLDIFS
317319
su ${USERNAME} -c ". ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk default java ${JAVA_VERSION}"
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
# Optional: Import test library
6+
source dev-container-features-test-lib
7+
8+
echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > HelloWorld.java
9+
javac HelloWorld.java
10+
11+
check "hello world" /bin/bash -c "java HelloWorld | grep "Hello, World!""
12+
check "java version latest installed" grep "22.0.2" <(java --version)
13+
14+
# Report result
15+
reportResults

test/java/scenarios.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@
88
}
99
}
1010
},
11+
"install_latest_version": {
12+
"image": "ubuntu:focal",
13+
"features": {
14+
"java": {
15+
"version": "latest"
16+
}
17+
}
18+
},
1119
"install_lts_version": {
1220
"image": "ubuntu:focal",
1321
"features": {

0 commit comments

Comments
 (0)