QCon「Javaの導入方法、アップデートやパッチの入手方法はすべて変化しています。オラクルはこれまでこのことを周知させてきましたが、大々的に宣伝してきませんでした」と、Azul Systemsの副CTO、サイモン・リッター氏はロンドンで開催中の開発者会議QConの参加者に語った。
Javaはかつて、快適ながらも苛立たしいほどの遅い進化を遂げてきました。メジャーリリースは2~3年ごとにリリースされる予定で、通常はそれよりも長い期間がかかっていました。しかし今では状況は逆転し、アップデートは6ヶ月ごとに行われています。JDK(Java Development Kit)9は2017年9月に一般提供が開始され、2018年3月末には廃止されます。つまり、公式アップデートは提供されなくなります。開発者は、JDK 10(これも同様に短い寿命となります)にアプリケーションを移行するか、JDK 8を使い続けるかのどちらかを選ばなければなりません。
「リリーストレインに乗ることは大きなコミットメントです」とJava開発者のStephen Colebourne氏は指摘する。「考慮すべき外部ツールや依存関係の数を考えると、Java 9または10を使用するというのは大胆な選択です。」
JDK 11はOracleがLTS(長期サービス)リリースに指定しているため、ある程度の救済策となります。これは2018年9月にリリースされる予定で、2026年までサポートされます。
しかし、Oracle は、すべてのデスクトップとサーバーを最新バージョンの JRE (Java Runtime Environment) で最新の状態に保つという考え方に熱意を失っています。
「オラクルは、自動アップデート機能を利用してデスクトップをJava 8からそれ以降のバージョンに移行する予定はありません」と公式声明には記されている。「企業以外のデスクトップでJava SEを必要とする個人ユーザーは、少なくとも2020年12月まではアップデートを受け取ります。プリインストールされたスタンドアロンのJREに頼るのではなく、アプリケーション開発者にはJREをアプリケーションに同梱して提供することを推奨します。」
さらに、Oracleは公式バイナリを64ビットLinux、SPARC、Windows、Macに限定しています。他のOS用のランタイムが必要な場合は、独自にコンパイルするか、他の場所で入手する必要があります。コードは公式サイトのOpenJDKサイトから簡単に入手できます。Linuxディストリビューションでは、ユーザー向けにJavaランタイムもパッケージ化されているのが一般的です。
Javaの主な変更点
アプリケーションにJREを同梱するというアイデアは、JDK 9以降のモジュール化(Project Jigsaw)により、より効率的になりました。Jlinkという新しいツールを使うと、カスタムランタイムに含めるモジュールを指定できます。java.baseというコアモジュールは常に必要です。
Java 開発者は、古いクラスパスではなく、実行時にモジュールが検出されるモジュールパスに慣れる必要があります。ただし、クラスパスは互換性のために引き続きサポートされています。
さらに、一部のJava機能は非推奨となり、削除される予定です。具体的には以下のとおりです。
- JavaプラグインとWeb Startテクノロジー。Javaアプレットは廃止されます。ただし、Chrome、Firefox、Edgeなどのブラウザでのサポートが廃止されたため、実際には既に問題が生じています。
- JavaFX – 元々は Flash と Silverlight に対する Sun の回答でしたが、JDK 11 では廃止されます。
- SOAP (java.xml.ws) は非推奨であり、JDK 11 で削除される可能性があります。これは問題になる可能性があります。Ritter が QCon で、SOAP を使用している人は誰かと尋ねたところ、かなり多くの人が手を挙げました。
- 分散オブジェクト用のシステムである CORBA も同様の運命を辿っていますが、現在それを使用している人はほとんどいません。
JShell、JDK 9 の Java 用インタラクティブ シェル
もちろん、新機能もたくさんあります。JDK 9は大きなリリースであり、次のような機能が導入されました。
- JShell: 対話型Javaを可能にするREPL(Read-Evaluate-Print-Loop)ツール。教育やプロトタイピングに便利。
- ストリーム API の改善
- 実験的なAOT(Ahead of Time)コンパイラ
他にも何百もの変更が行われました。
まもなくリリースされるJDK 10には、C#開発者に長年お馴染みのvarキーワードによる型推論など、新機能が搭載されています。これにより、次のようなコードが入力可能になります。
var arr = 新しいArrayList<String>();
変数 arr は依然として厳密に型指定されていますが、型は割り当てから推論されます。
JVM には Docker コンテナの特別なサポートもあり、利用可能なリソースを検出するときに、オペレーティング システムではなくコンテナ構成を読み取ります。
リッター氏はまた、まだリリースが決まっていないいくつかの長期プロジェクトについても言及した。
- Project Amber: 前述の型推論だけでなく、パターン マッチングなどを含む言語の変更。
- Project Loom: ファイバーと呼ばれる軽量スレッドと、非同期コーディングを容易にする継続をサポートします。
- Project Metropolis: JVM ランタイム自体の一部を Java でコードします。
- Project Panama: 新しい Native InterConnect レイヤーを介してネイティブ コードとの相互運用性を向上させます。
- Project Valhalla: プリミティブ型が適しておらず、オブジェクト型ではコストがかかりすぎる場合に、より効率的なコードを実現するための値型。
Java の進化の代償?
Javaの新しいリリーストレインはよりアジャイルですが、それには代償が伴います。アプリケーションのパッチ適用と最新化を維持する負担が、開発者とパッケージメンテナーにさらに重くのしかかることになります。Oracleは自社のメンテナンス負担を軽減するとともに、おそらくより多くの顧客に有料サポートを勧めようとしているのでしょう。
とはいえ、ほとんどの開発者は JDK 9 や 10 のようなリリースを本番環境用ではなくテストや実験用のソフトウェアとして扱うため、新しいリリース サイクルのペースは以前と似たものになります。ただし、Oracle の新しいパブリック配布アプローチを理解する必要があります。®