公式Java Dockerイメージを活用する
- 特定のバージョンのJVMを使ってテストしたい
- JVMのインストールが面倒
って時はJVMのDockerイメージを活用すると楽ですね。
$ cat Hoge.java
public class Moge {
public static void main(String[] args) {
System.out.println("hoge");
}
}
$ docker run --rm -it --volume `pwd`:/tmp adoptopenjdk/openjdk11-openj9 java /tmp/Hoge.java
hoge
javaをコンパイルせずに実行してる?
-> JEP330
Java11:単一ファイルのJavaコードをそのまま実行
Java11ではjavacせずにJavaファイルが実行できるようになる
参考
Dockerで色んなJDKを試す
AdoptOpenJDK https://adoptopenjdk.net
公式Dockerイメージ https://hub.docker.com/u/adoptopenjdk/
メモ:繰り返し実行
$ docker run --rm -it --volume `pwd`:/tmp adoptopenjdk/openjdk11-openj9 /bin/sh -c 'for i in `seq 1 10`; do java -jar /tmp/MDTest.jar |grep -v dig; done' | awk '{sum+=$3} END {print "avg="sum/NR}'
avg=26.1
jshell
- 手っ取り早くJavaで(記述した)処理を実行したい
- クラスやmainなど書きたくない、コンパイル&実行面倒
って時は jshellが便利ですね。DockerがあればJava9以降を入れてない環境でもサクッと使えますし。
$ docker run --rm -it adoptopenjdk/openjdk11-openj9 jshell
Nov 16, 2018 12:00:26 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
| Welcome to JShell -- Version 11.0.1
| For an introduction type: /help intro
jshell> System.out.println("moge")
moge
jshell> java.time.Instant.ofEpochMilli(1294012469700l);
$1 ==> 2011-01-02T23:54:29.700Z
jshell>
そや、one-linerってどうやって書くんでしょう?
[JavaのJShellでワンライナーのスクリプトを書く方法(ついでにFizzBuzzのコードゴルフ)]
(http://sucrose.hatenablog.com/entry/2018/05/05/230434)
なるほど!
$ echo 'println("hello, world!")' | docker run --rm -it adoptopenjdk/openjdk11-openj9 jshell PRINTING -
the input device is not a TTY
あれ?ああ。
$ echo 'println("hello, world!")' | docker run --rm -i adoptopenjdk/openjdk11-openj9 jshell PRINTING -
Nov 16, 2018 3:12:46 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
hello, world!
なんでもかんでも -it つけてた。
参考
JShellで始めるJava - Javaの世界を覗いてみる
JShellを使ってJava2Dであそぶ
[Java9 新機能] jshell入門