Azure Cloud Shell で Maven 3.6 を Java 11 で動かしてみる

2022.05.21

いわさです。

Azure Cloud Shell(bash) では Microsoft Build of OpenJDK 17 がプリインストールされています。
Maven3.6 で Java 11 を使いたかったので、Microsoft Build of OpenJDK 11 をインストールしてみました。

デフォルトは Microsoft OpenJDK 17

Azure Cloud Shell(bash)にアクセスし、mvnを実行するとJavaのバージョンが出力されています。
本日時点では、v17がデフォルトでセットアップされています。

iwasa_takahito@Azure:~$ mvn -X
Apache Maven 3.6.0
Maven home: /usr/share/maven
Java version: 17.0.2, vendor: Microsoft, runtime: /usr/lib/jvm/msopenjdk-17-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-1078-azure", arch: "amd64", family: "unix"
[ERROR] Error executing Maven.

root権限がないので手動インストールしてみた

Azure Cloud Shellではroot権限がない

特定バージョンをインストールしたいところですが、Azure Cloud Shellではroot権限が与えられておらず、パッケージマネージャーなどからのインストールは難しそうです。

iwasa_takahito@Azure:~$ apt-get install openjdk-8-jre
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
iwasa_takahito@Azure:~$ sudo apt-get install openjdk-8-jre
bash: sudo: command not found

ダウンロードしてインストールしてみる

回避策として、今回は手動でダウンロードしてインストール出来るかを試してみたいと思います。
Microsoft Build of OpenJDK 11は以下から入手可能です。Linux版(x64)を入手します。

iwasa_takahito@Azure:~$ wget https://aka.ms/download-jdk/microsoft-jdk-11.0.15-linux-x64.tar.gz
--2022-05-16 21:22:10--  https://aka.ms/download-jdk/microsoft-jdk-11.0.15-linux-x64.tar.gz
Resolving aka.ms (aka.ms)... 104.79.121.189
Connecting to aka.ms (aka.ms)|104.79.121.189|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://download.visualstudio.microsoft.com/download/pr/8309c7e7-a5f7-4f39-9684-7a1dd4994dc6/3bf8cc1a1a0cd7318d006f5d2b3eec32/microsoft-jdk-11.0.15-linux-x64.tar.gz [following]
--2022-05-16 21:22:11--  https://download.visualstudio.microsoft.com/download/pr/8309c7e7-a5f7-4f39-9684-7a1dd4994dc6/3bf8cc1a1a0cd7318d006f5d2b3eec32/microsoft-jdk-11.0.15-linux-x64.tar.gz
Resolving download.visualstudio.microsoft.com (download.visualstudio.microsoft.com)... 192.229.232.200, 2606:2800:147:ff8:129b:22eb:20b:1347
Connecting to download.visualstudio.microsoft.com (download.visualstudio.microsoft.com)|192.229.232.200|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 192834227 (184M) [application/octet-stream]
Saving to: ‘microsoft-jdk-11.0.15-linux-x64.tar.gz’

microsoft-jdk-11.0.15-linux-x64.tar 100%[===================================================================>] 183.90M   238MB/s    in 0.8s    

2022-05-16 21:22:13 (238 MB/s) - ‘microsoft-jdk-11.0.15-linux-x64.tar.gz’ saved [192834227/192834227]

iwasa_takahito@Azure:~$ tar xzvf microsoft-jdk-11.0.15-linux-x64.tar.gz 
jdk-11.0.15+10/
jdk-11.0.15+10/bin/
jdk-11.0.15+10/bin/jaotc
jdk-11.0.15+10/bin/jar
jdk-11.0.15+10/bin/jarsigner
jdk-11.0.15+10/bin/java
jdk-11.0.15+10/bin/javac
jdk-11.0.15+10/bin/javadoc
jdk-11.0.15+10/bin/javap
jdk-11.0.15+10/bin/jcmd
jdk-11.0.15+10/bin/jconsole

:

Mavenで利用するためにJavaのパスの解決とJAVA_HOMEの設定までを今回はしてみましょう。

iwasa_takahito@Azure:~$ which java
/usr/bin/java
iwasa_takahito@Azure:~$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Mar  8 18:58 /usr/bin/java -> /etc/alternatives/java
iwasa_takahito@Azure:~$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 40 Mar  8 18:58 /etc/alternatives/java -> /usr/lib/jvm/msopenjdk-17-amd64/bin/java
iwasa_takahito@Azure:~$ echo $JAVA_HOME
/usr/lib/jvm/msopenjdk-17-amd64
iwasa_takahito@Azure:~$ ln -sf ~/jdk-11.0.15+10/bin/java /etc/alternatives/java
ln: failed to create symbolic link '/etc/alternatives/java': Permission denied
iwasa_takahito@Azure:~$ ln -sf ~/jdk-11.0.15+10/bin/java /usr/bin/java
ln: failed to create symbolic link '/usr/bin/java': Permission denied

ただし、前述の権限の問題があるので、シンボリックリンクの更新などは行わずにパスは先頭に割り込ませる形にしました。
もうちょっとやりようがありそうですが、今日はMavenにJava11を認識させるところまでをゴールにしているので一旦この形にします。

iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ export JAVA_HOME=/home/iwasa_takahito/jdk-11.0.15+10
iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ export PATH=/home/iwasa_takahito/jdk-11.0.15+10/bin:$PATH
iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ echo $PATH
/home/iwasa_takahito/jdk-11.0.15+10/bin:~/.local/bin:~/bin:~/.dotnet/tools:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/istio-latest/bin:/usr/local/linkerd/bin:/usr/local/go/bin:/opt/mssql-tools/bin:~/bundle/bin:~/bundle/gems/bin
iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ which java
/home/iwasa_takahito/jdk-11.0.15+10/bin/java

iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ java --version
openjdk 11.0.15 2022-04-19 LTS
OpenJDK Runtime Environment Microsoft-32930 (build 11.0.15+10-LTS)
OpenJDK 64-Bit Server VM Microsoft-32930 (build 11.0.15+10-LTS, mixed mode)
iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ mvn -X
Apache Maven 3.6.0
Maven home: /usr/share/maven
Java version: 11.0.15, vendor: Microsoft, runtime: /home/iwasa_takahito/jdk-11.0.15+10
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-1078-azure", arch: "amd64", family: "unix"
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/usr/share/maven/lib/guice.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[DEBUG] Created new class realm maven.api
[DEBUG] Importing foreign packages into class realm maven.api
[DEBUG]   Imported: javax.annotation.* < plexus.core
[DEBUG]   Imported: javax.annotation.security.* < plexus.core
:

Maven実行出来ましたね。

さいごに

Azure Cloud Shellの仕様として、マウントされたAzure File Shareを使って$HOMEが永続化されるそうなので、実用的かどうかはともかくインストールだけしておけばMavenを使うタイミングで環境変数でJavaバージョンの切り替えは出来そうかなという所感です。
今回はJavaをセットアップしましたが、Pythonの旧バージョンなどにも応用出来そうです。ランタイムによってはビルドし直さないといけないかもしれないですが。