JDKは既に11まで進んでいます
JDK11が2018/9にリリースされました。みなさん既にインストールされましたか?
これまで慣れてきたOracle版を選んだ人や、初めてOpenJDKをインストールした人それぞれではないでしょうか?
世の中のJavaエバンジェリストの人たちはこぞって、現在選ぶべきJDKをいろんな観点からあげてくれています。これはとても助かる情報です。
そこで本記事ではJDK5とか6をナウで使っている俺たちはどうすればいいの?という声なき声に応えたいと思います。
Oracle JDKの世代別サポート期間
まず、過去においてOracle JDKのサポート期間はどうであったか?
見ての通り、リリースの間隔も長ければ保守期間も長い
- JDK1.4 2000年リリース
- JDK5 2004年リリース 公式アップデート終了 2009年10月
- JDK6 2006年リリース 公式アップデート終了 2013年2月
- JDK7 2011年リリース 公式アップデート終了 2015年4月
- JDK8 2014年リリース 公式アップデート終了 2019年1月
- JDK9 2017年リリース 公式アップデート終了 2018年3月
- JDK10 2018年リリース 公式アップデート終了 2018年9月
- JDK11 2018年リリース
だが、そんな時間の流れが遅い時代は既に終わっている。しかし、過去の遅い流れの時間の中で過ごしているプロジェクト、チームこそ読んでほしい。
for文で振り返るJava
JDK1.4
int[] array = new int[10];
for(int i = 0; i < 10; i++) {
System.out.println(array[i]);
}
2002年当時、Javaは最先端であった。今も1.4で動いているシステムがあるとするならば、JDK11のことを今更気にするのはどうかしている。いつまでも秀丸でJavaを書き続けよう。
JDK5/6/7
int[] array = new int[10];
for(int i: array) {
System.out.println(i);
}
拡張for文を書くことがステータスだった時代。既存のfor文を意味もなく、リファクタリングといって書き換えていた時代が懐かしい。
JDK5/6/7を使っている人は実は2種類いると分けられると思う。Oracleに金を払っている人とそうでない人だ。
Oracleにお金を払っている人
**OracleのSustaining Supportを利用している人はJDK11の存在は忘れてOK。**そのシステムはそのJDKでEOSまでやりきろう。
Oracleにお金を払っていない人
2015年4月にサポートの切れたJDKを使っているということは、恐らくアップデートの意思はないだろう。そのまま、EOSまでやりきろう。ただし、そのシステムはあと10年は使うと思うのでセキュリティインシデントには気をつけよう。
JDK8
int[] array = new int[10];
Arrays.stream(array).forEach(arr -> System.out.println(arr));
Streamを使っていない人
Streamだ。既にfor文を書かずに処理が実行可能だ。これを見て、「これはJavaなのか?」と思う人はJDK11の事を気にする必要はない。そのシステムがEOSを迎えるまであと10年はJDK8で頑張ろう。
Streamを使っていて、Oracleにお金を払っていない人
ここが一番難しい。恐らく、最初からJDK8で作られた現役バリバリのシステムに違いない。そして、そういう人にオススメしたいのはもう、Javaのバージョンに縛られるな。思い切って、Open JDK11への移行を検討しよう。
2019年初めにサポートは切れる。そして、LTSがない現状ではどのJDKでも同じだ。
**「異なるJDKでビルドすると全テストを求められる」とビビってしまうのはわかる。**しかし、既にあなたのアプリケーションで使っている、Apache commonsなどはいつのJDKでビルドされたのを使っているか知っているか?多分、恐ろしく古いはず。
とりあえず、JDK11でビルドして動かしてみよう。
一つだけ注意しておくと、JDK11はJAVAEE系のライブラリがごっそり削除されているので、その部分はmavenかgradleで追加しないといけない。流石にJava8ならビルドツール使っているだろうからそこは簡単に対応できるだろう。
JDK9/10/11
int[] array = new int[10];
Arrays.stream(array).dropWhile(arr -> array <= 1).forEach(System.out::println);
dropWhileを記述しているので、仕様を変えてしまっているが、そこはさておき、Streamに新メソッドが追加されている。Javaもどんどんよくなってきているのだ。この書き方を見てJavaScriptと見分けがつかない人も既に多いだろう。
この段階にいる人は既にJDK11を試しているだろう。それでいい。しかし、ここでも大きく2パターンに別れることになるだろう。
JDKのリリースに開発体制が追随できる
半年間のJDKリリースタイミングにアプリのリリースが合わせられるアジャイルなチームはぜひJDKのバージョンに付いていってほしい。付いていっても、お客様になんのメリットもないとは思うが、唯一セキュリティ的な意味では良いのかもしれない。
開発をしている間にJDKが2つぐらい上がってそうなチーム
提案書に明記しよう。「本開発はJDK11でビルドし、リリースを行います。それ以外のJDKでの動作確認は一切致しません」
まとめというか備え
ホラーストーリーも書いているが、何れにしてもJavaをこれからもやる人はJava8時代の書き方を身につけないといけない。いつまでも、for文を書いている人は退場するしかない。
私は以下をとてもお薦めしている。自分でもかなり読み込んだ
Java8スタイルを理解するにはまず読んでおいてほしい
Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング
Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで
そして、Java Webアプリケーションの作り方を大きく変えたSpring Bootでアプリを組んでみる事をお薦めする。何がすごいというのはAutoConfigurationのそれに尽きる。
C#でASP.NETを書いているのかと思わせたり、Angularを書いているのかと錯覚したりする。
おすすめははじめてのSpringBootだが、Ver1と少し古い。Ver2向けの書籍も出ており、読みはしたが、超絶おすすめというわけではない。でも読まないより読んでおいた方が良いので挙げておく。
なぜかというと、Spring Bootでアプリを作るということはそのお作法に極限まで寄せることだからだ。コードを書きすぎないためにはフレームワークの仕様をじっくり理解することがまずは大切であるという事を記載しておく。
はじめてのSpringBoot
SpringBoot2入門