クラウド・シェルでJava21を使いたい(csruntimectlを調べる)

この記事は、 JPOUG Advent Calendar 2024 6日目の記事です。
5日目はNoraさんの記事でした。

 

クラウド・シェルでは、Javaが使えます。

クラウド・シェルの使用

-言語ランタイムの管理

 

現在クラウド・シェルでサポートされているランタイムのバージョンを確認するには、listオプションを使用します。例:

csruntimectl java list

 

実際に確認してみると3種類のJavaランタイムが使えるようです。

xxx@cloudshell:~ (ap-osaka-1)$ csruntimectl java list
   graalvmjdk-17                                                      /usr/lib64/graalvm/graalvm-java17
   oraclejdk-1.8                                              /usr/lib/jvm/jdk-1.8.0_431-oracle-aarch64
 * oraclejdk-11                                                 /usr/lib/jvm/jdk-11.0.25-oracle-aarch64

 

が、、、少し古くない?

Java21*が使いたいんだけど。。

 

*マイクラプラグイン開発はJava21が標準らしいので、クラウド・シェルでできたら嬉しい。

 

というわけで、今回は、csruntimectlについて調べてみることにします。

そもそも、csruntimectl って何?どこかにインストールされている?

 

xxxxxx@cloudshell:~ (ap-osaka-1)$ which csruntimectl
/usr/bin/which: no csruntimectl in (/usr/lib/jvm/jdk-11.0.25-oracle-aarch64/bin/:/opt/dataflow/scala/scala-2.12.15/bin/:/opt/dataflow/sbt/sbt/bin/:/opt/dataflow/df_setup/spark-*-bin*/bin/:/opt/ogg/bin:/home/s4r_agent/.yarn/bin:/home/s4r_agent/.config/yarn/global/node_modules/.bin:/opt/oracle/sqlcl/bin:/usr/lib/oracle/19.10/client64/bin/:/opt/odsp:/home/oci/.pyenv/plugins/pyenv-virtualenv/shims:/home/oci/.pyenv/shims:/home/oci/.pyenv/bin:/opt/rh/rh-ruby27/root/usr/local/bin:/opt/rh/rh-ruby27/root/usr/bin:/opt/rh/rh-python38/root/usr/local/bin:/opt/rh/rh-python38/root/usr/bin:/opt/rh/rh-maven35/root/usr/bin:/opt/rh/rh-git218/root/usr/bin:/opt/rh/httpd24/root/usr/bin:/opt/rh/httpd24/root/usr/sbin:/opt/rh/devtoolset-10/root/usr/bin:/home/oci/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/s4r_agent/.composer/vendor/bin:/opt/yarn-v1.22.19/bin)

 

実行ファイルじゃなさそうですね。

プロファイルを追いかけます。

 

 

.bashrc

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
source /etc/bashrc.cloudshell

 

いかにもそれっぽいの読み込んでますね。

 

 cat /etc/bashrc.cloudshell

# Make sure to source the script 'manage-runtime'
function csruntimectl() {
  source /usr/local/bin/manage-runtime "$@"
}

# Export JAVA_HOME and PATH env variables for the current java runtime.
csruntimectl java export

 

ありました!

 

さらに調べます。

cat  /usr/local/bin/manage-runtime

#!/usr/bin/env bash

if grep -q "Red Hat Enterprise Linux Server release 7" /etc/redhat-release 
then
  source manage-runtime-ol7 "$@"
elif grep -q "Red Hat Enterprise Linux release 8" /etc/redhat-release
then
  source manage-runtime-ol8 "$@"
fi

 

OSのバージョンで分岐してるみたいですね。

cat /etc/redhat-release

Red Hat Enterprise Linux Server release 7.9 (Maipo)

 

ということで、分岐先のファイルを見ます。

 

 less /usr/local/bin/manage-runtime-ol7

#!/usr/bin/env bash

#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
#
# Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
#

[ -n "$ENABLE_DEBUG" ] && set -x

JDK_VERSION_ROOT="${HOME}/.oci/java"
CURRENT_VERSION_FILE="${JDK_VERSION_ROOT}/current-version"
OCI_ROOT="/etc"
VERSIONS_FILE="${OCI_ROOT}/java-versions"

# Default jdk version alias specified in format javaProvider-javaVersion
DEFAULT_JAVA_VERSION=oraclejdk-11

javaRuntime=false

usage() {
  echo "Usage:"
  echo "" 
  echo "  csruntimectl java set <version alias>    Switch to a specific java version by giving a version alias."
  echo "  csruntimectl java list                   Display all java version aliases and their corresponding JAVA_HOME."
  echo "  csruntimectl help                        Output this help usage."
  echo "" 
  return 1
}

# Get the full path from the versions file based on the javaShortVersion
searchJavaPath() {
  javaShortVersion=$1

  javaHomePath=""
  if [ -f ${VERSIONS_FILE} ]; then
    while read -a line;  do
      if [ -n "${line}" ]; then
        IFS='='
        read -ra strarray <<< "${line}"   # version is read into an array as tokens separated by IFS
         #${strarray[0]} ${strarray[1]}
         if [ "${strarray[0]}" = "${javaShortVersion}" ]; then
           # Found the matching short java version
           javaHomePath="${strarray[1]}"
           break
         fi
        IFS=' '  # reset to default
      fi
    done < "${VERSIONS_FILE}"
  else
    echo >&2 "${VERSIONS_FILE} does not exist. No java version to manage."
    return 1
  fi
  echo "${javaHomePath}"
}

・・・・・

 

/etc/java-versions をからcsruntimeutilでセットできるJavaを見ている模様。

そして、、、/etc/java-versionを編集する方法は、、、ありません。

 

クラウド・シェルの制限

 

  • クラウド・シェルではルート・アクセスができず、sudoも使用できないため、インストールにルート・アクセスが必要なパッケージはインストールできません。インストールにルートを必要としないバージョンのパッケージが多数用意されています。解凍してホーム・ディレクトリにインストールできます。

 

 

個別にJavaを配置すれば使用できるみたいですね。

 

xxxx@cloudshell: (ap-osaka-1)$wget https://download.oracle.com/java/21/latest/jdk-21_linux-aarch64_bin.tar.gz

 

xxxx@cloudshell: (ap-osaka-1)$cd jdk-21*/bin

 

xxxx@cloudshell:bin (ap-osaka-1)$ ./java -version
java version "21.0.5" 2024-10-15 LTS
Java(TM) SE Runtime Environment (build 21.0.5+9-LTS-239)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.5+9-LTS-239, mixed mode, sharing)

 

 

今日はここまで。

 

明日は、gowatanaさんの記事です。