Unverified Commit 5077a2cb authored by Prathamesh Zarkar's avatar Prathamesh Zarkar Committed by GitHub

[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
parent 0be79410
{ {
"id": "java", "id": "java",
"version": "1.6.0", "version": "1.6.1",
"name": "Java (via SDKMAN!)", "name": "Java (via SDKMAN!)",
"documentationURL": "https://github.com/devcontainers/features/tree/main/src/java", "documentationURL": "https://github.com/devcontainers/features/tree/main/src/java",
"description": "Installs Java, SDKMAN! (if not installed), and needed dependencies.", "description": "Installs Java, SDKMAN! (if not installed), and needed dependencies.",
......
...@@ -53,14 +53,6 @@ else ...@@ -53,14 +53,6 @@ else
exit 1 exit 1
fi fi
if [ "${ADJUSTED_ID}" = "rhel" ] && [ "${VERSION_CODENAME-}" = "centos7" ]; then
# As of 1 July 2024, mirrorlist.centos.org no longer exists.
# Update the repo files to reference vault.centos.org.
sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo
sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo
sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo
fi
# Setup INSTALL_CMD & PKG_MGR_CMD # Setup INSTALL_CMD & PKG_MGR_CMD
if type apt-get > /dev/null 2>&1; then if type apt-get > /dev/null 2>&1; then
PKG_MGR_CMD=apt-get PKG_MGR_CMD=apt-get
...@@ -79,6 +71,67 @@ else ...@@ -79,6 +71,67 @@ else
exit 1 exit 1
fi fi
pkg_manager_update() {
case $ADJUSTED_ID in
debian)
if [ "$(find /var/lib/apt/lists/* | wc -l)" = "0" ]; then
echo "Running apt-get update..."
${PKG_MGR_CMD} update -y
fi
;;
rhel)
if [ ${PKG_MGR_CMD} = "microdnf" ]; then
if [ "$(ls /var/cache/yum/* 2>/dev/null | wc -l)" = 0 ]; then
echo "Running ${PKG_MGR_CMD} makecache ..."
${PKG_MGR_CMD} makecache
fi
else
if [ "$(ls /var/cache/${PKG_MGR_CMD}/* 2>/dev/null | wc -l)" = 0 ]; then
echo "Running ${PKG_MGR_CMD} check-update ..."
set +e
stderr_messages=$(${PKG_MGR_CMD} -q check-update 2>&1)
rc=$?
# centos 7 sometimes returns a status of 100 when it apears to work.
if [ $rc != 0 ] && [ $rc != 100 ]; then
echo "(Error) ${PKG_MGR_CMD} check-update produced the following error message(s):"
echo "${stderr_messages}"
exit 1
fi
set -e
fi
fi
;;
esac
}
# Checks if packages are installed and installs them if not
check_packages() {
case ${ADJUSTED_ID} in
debian)
if ! dpkg -s "$@" > /dev/null 2>&1; then
pkg_manager_update
${INSTALL_CMD} "$@"
fi
;;
rhel)
if ! rpm -q "$@" > /dev/null 2>&1; then
pkg_manager_update
${INSTALL_CMD} "$@"
fi
;;
esac
}
if [ "${ADJUSTED_ID}" = "rhel" ] && [ "${VERSION_CODENAME-}" = "centos7" ]; then
# As of 1 July 2024, mirrorlist.centos.org no longer exists.
# Update the repo files to reference vault.centos.org.
sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo
sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo
sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo
yum update -y
check_packages epel-release
fi
# Clean up # Clean up
clean_up() { clean_up() {
local pkg local pkg
...@@ -95,7 +148,6 @@ clean_up() { ...@@ -95,7 +148,6 @@ clean_up() {
;; ;;
esac esac
} }
clean_up
# Ensure that login shells get the correct path if the user updated the PATH using ENV. # Ensure that login shells get the correct path if the user updated the PATH using ENV.
rm -f /etc/profile.d/00-restore-env.sh rm -f /etc/profile.d/00-restore-env.sh
...@@ -143,80 +195,33 @@ updaterc() { ...@@ -143,80 +195,33 @@ updaterc() {
fi fi
} }
pkg_manager_update() {
case $ADJUSTED_ID in
debian)
if [ "$(find /var/lib/apt/lists/* | wc -l)" = "0" ]; then
echo "Running apt-get update..."
${PKG_MGR_CMD} update -y
fi
;;
rhel)
if [ ${PKG_MGR_CMD} = "microdnf" ]; then
if [ "$(ls /var/cache/yum/* 2>/dev/null | wc -l)" = 0 ]; then
echo "Running ${PKG_MGR_CMD} makecache ..."
${PKG_MGR_CMD} makecache
fi
else
if [ "$(ls /var/cache/${PKG_MGR_CMD}/* 2>/dev/null | wc -l)" = 0 ]; then
echo "Running ${PKG_MGR_CMD} check-update ..."
set +e
stderr_messages=$(${PKG_MGR_CMD} -q check-update 2>&1)
rc=$?
# centos 7 sometimes returns a status of 100 when it apears to work.
if [ $rc != 0 ] && [ $rc != 100 ]; then
echo "(Error) ${PKG_MGR_CMD} check-update produced the following error message(s):"
echo "${stderr_messages}"
exit 1
fi
set -e
fi
fi
;;
esac
}
# Checks if packages are installed and installs them if not
check_packages() {
case ${ADJUSTED_ID} in
debian)
if ! dpkg -s "$@" > /dev/null 2>&1; then
pkg_manager_update
${INSTALL_CMD} "$@"
fi
;;
rhel)
if ! rpm -q "$@" > /dev/null 2>&1; then
pkg_manager_update
${INSTALL_CMD} "$@"
fi
;;
esac
}
# Use Microsoft JDK for everything but JDK 8 and 18 (unless specified differently with jdkDistro option)
get_jdk_distro() {
VERSION="$1"
if [ "${JDK_DISTRO}" = "ms" ]; then
if echo "${VERSION}" | grep -E '^8([\s\.]|$)' > /dev/null 2>&1 || echo "${VERSION}" | grep -E '^18([\s\.]|$)' > /dev/null 2>&1; then
JDK_DISTRO="tem"
fi
fi
}
find_version_list() { find_version_list() {
prefix="$1" prefix="$1"
suffix="$2" suffix="$2"
install_type=$3 install_type=$3
ifLts="$4" ifLts="$4"
version_list=$5 version_list=$5
java_ver=$6
check_packages jq
all_versions=$(curl -s https://api.adoptium.net/v3/info/available_releases)
if [ "${ifLts}" = "true" ]; then if [ "${ifLts}" = "true" ]; then
all_lts_versions=$(curl -s https://api.adoptium.net/v3/info/available_releases) major_version=$(echo "$all_versions" | jq -r '.most_recent_lts')
major_version=$(echo "$all_lts_versions" | jq -r '.most_recent_lts') elif [ "${java_ver}" = "latest" ]; then
regex="${prefix}\\K${major_version}\\.?[0-9]*\\.?[0-9]*${suffix}" major_version=$(echo "$all_versions" | jq -r '.most_recent_feature_release')
else else
major_version=$(echo "$java_ver" | cut -d '.' -f 1)
fi
if [ "${JDK_DISTRO}" = "ms" ]; then
if [ "${major_version}" = "8" ] || [ "${major_version}" = "18" ] || [ "${major_version}" = "22" ]; then
JDK_DISTRO="tem"
fi
fi
if [ "${install_type}" != "java" ]; then
regex="${prefix}\\K[0-9]+\\.?[0-9]*\\.?[0-9]*${suffix}" regex="${prefix}\\K[0-9]+\\.?[0-9]*\\.?[0-9]*${suffix}"
else
regex="${prefix}\\K${major_version}\\.?[0-9]*\\.?[0-9]*${suffix}${JDK_DISTRO}\\s*"
fi fi
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")" 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")"
} }
...@@ -237,13 +242,12 @@ sdk_install() { ...@@ -237,13 +242,12 @@ sdk_install() {
elif [[ "${pkg_vals}" =~ "${install_type}" ]] && [ "${requested_version}" = "latest" ]; then elif [[ "${pkg_vals}" =~ "${install_type}" ]] && [ "${requested_version}" = "latest" ]; then
requested_version="" requested_version=""
elif [ "${requested_version}" = "lts" ]; then elif [ "${requested_version}" = "lts" ]; then
check_packages jq find_version_list "$prefix" "$suffix" "$install_type" "true" version_list "${requested_version}"
find_version_list "$prefix" "$suffix" "$install_type" "true" version_list
requested_version="$(echo "${version_list}" | head -n 1)" requested_version="$(echo "${version_list}" | head -n 1)"
elif echo "${requested_version}" | grep -oE "${full_version_check}" > /dev/null 2>&1; then elif echo "${requested_version}" | grep -oE "${full_version_check}" > /dev/null 2>&1; then
echo "${requested_version}" echo "${requested_version}"
else else
find_version_list "$prefix" "$suffix" "$install_type" "false" version_list find_version_list "$prefix" "$suffix" "$install_type" "false" version_list "${requested_version}"
if [ "${requested_version}" = "latest" ] || [ "${requested_version}" = "current" ]; then if [ "${requested_version}" = "latest" ] || [ "${requested_version}" = "current" ]; then
requested_version="$(echo "${version_list}" | head -n 1)" requested_version="$(echo "${version_list}" | head -n 1)"
else else
...@@ -301,8 +305,7 @@ if [ ! -d "${SDKMAN_DIR}" ]; then ...@@ -301,8 +305,7 @@ if [ ! -d "${SDKMAN_DIR}" ]; then
updaterc "export SDKMAN_DIR=${SDKMAN_DIR}\n. \${SDKMAN_DIR}/bin/sdkman-init.sh" updaterc "export SDKMAN_DIR=${SDKMAN_DIR}\n. \${SDKMAN_DIR}/bin/sdkman-init.sh"
fi fi
get_jdk_distro ${JAVA_VERSION} sdk_install java ${JAVA_VERSION} "\\s*" "(\\.[a-z0-9]+)*-" ".*-[a-z]+$" "true"
sdk_install java ${JAVA_VERSION} "\\s*" "(\\.[a-z0-9]+)*-${JDK_DISTRO}\\s*" ".*-[a-z]+$" "true"
# Additional java versions to be installed but not be set as default. # Additional java versions to be installed but not be set as default.
if [ ! -z "${ADDITIONAL_VERSIONS}" ]; then if [ ! -z "${ADDITIONAL_VERSIONS}" ]; then
...@@ -310,8 +313,7 @@ if [ ! -z "${ADDITIONAL_VERSIONS}" ]; then ...@@ -310,8 +313,7 @@ if [ ! -z "${ADDITIONAL_VERSIONS}" ]; then
IFS="," IFS=","
read -a additional_versions <<< "$ADDITIONAL_VERSIONS" read -a additional_versions <<< "$ADDITIONAL_VERSIONS"
for version in "${additional_versions[@]}"; do for version in "${additional_versions[@]}"; do
get_jdk_distro ${version} sdk_install java ${version} "\\s*" "(\\.[a-z0-9]+)*-" ".*-[a-z]+$" "false"
sdk_install java ${version} "\\s*" "(\\.[a-z0-9]+)*-${JDK_DISTRO}\\s*" ".*-[a-z]+$" "false"
done done
IFS=$OLDIFS IFS=$OLDIFS
su ${USERNAME} -c ". ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk default java ${JAVA_VERSION}" su ${USERNAME} -c ". ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk default java ${JAVA_VERSION}"
......
#!/bin/bash
set -e
# Optional: Import test library
source dev-container-features-test-lib
echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }' > HelloWorld.java
javac HelloWorld.java
check "hello world" /bin/bash -c "java HelloWorld | grep "Hello, World!""
check "java version latest installed" grep "22.0.2" <(java --version)
# Report result
reportResults
...@@ -8,6 +8,14 @@ ...@@ -8,6 +8,14 @@
} }
} }
}, },
"install_latest_version": {
"image": "ubuntu:focal",
"features": {
"java": {
"version": "latest"
}
}
},
"install_lts_version": { "install_lts_version": {
"image": "ubuntu:focal", "image": "ubuntu:focal",
"features": { "features": {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment