新しいJavaのモジュール機能「Project Jigsaw」
Javaにおけるモジュールとは一体何でしょうか。Javaでモジュール管理といえば、MavenやGradleなどを思い浮かべる方が多いのではないかと思います。また、Eclipseなどで採用されているOSGiを想像する方もいるでしょう。
これまでのProject Jigsawの経緯を知っている方は、このモジュール機能がMavenやOSGiなどと一緒に議論されていたこともあったことを知っていると思います。つまり、これらのモジュール機能と新しいモジュール機能の役割が違うことを把握すると、Project Jigsawの目的がお分かりいただけるでしょう。
プログラムの実装から実行までの工程と、既存のモジュール機能との関係性を記したのが図2です。
モジュール管理といえば、多くの方がMavenを使っています。Androidの場合はGradleが標準であるため、そちらを使っている方も多いでしょう。これらは主にビルドするために使われているツールです。
IDEによっては、ツールの設定ファイルを読みこみ、コーディング時に自動でチェックする機能もあります。そのため、コードを書く際にも役に立ちますが、これはあくまで作業を楽にするための位置づけです。
また、作るアプリケーションがどのライブラリに依存しているかを記しているため、ビルド時の設定ファイルはそのためのドキュメントという側面も持っています。
ただし、あくまでも主役はコーディング後のビルドで実施するJARファイル構築や、必要なリソースファイル等のパッケージングであるため、実行後のサポートは何もありません。そのためビルド時には不要であるものの、実行時に必要となるライブラリのチェックはできません。
一方でOSGiは、実行後に一部分だけの機能を追加するケースや、追加した機能のみを更新するケースにも対応しています。Eclipseを使っている方がそれらの追加機能をプラグインと呼んでいることからも、モジュール管理よりもプラグイン機能の管理と表現したほうが、より分かりやすいかと思います。そのため、ここまでのモジュール管理機能を必要としているケースは少ないかもしれません。
最も大きな違いは、MavenやGradle、OSGiといったどんなモジュール管理機能であっても、これまでのモジュール管理はあくまでもコアのJavaライブラリの上に構築されていたということです。従って、これらのモジュール機能ではあくまで既存の機能の拡張でしかありませんでした。
しかし、サーバー側とクライアント側ではセキュリティで求められる方向性も多少異なり、Javaそのもののセキュリティにまで需要は広がり始めています。例えば、アプリに含まれる未使用のライブラリやJavaのコアAPIを使い、セキュリティホールへ攻撃するケースです。これは、ライブラリの正規の機能を悪用する場合もありますし、ライブラリが潜在的に持っている不具合の場合もあります。
この問題を踏まえて、Javaのパッケージごとに機能へのアクセス指定ができるようになったことが、今回のモジュール機能の大きな特徴です。また、コアのJavaライブラリに対してモジュール管理がされているため、内部的にはかなり大規模な変更が行われています。そして、その変更は同時に言語仕様にまで及んでいます。
また、必要最低限のJRE環境のカスタマイズまでできるようになりました。これらの機能はソフトウェアの安全面と実行環境のスリム化に大きく寄与します。今後、Javaはスマートフォンやその他のより小さいデバイスに向けて、さらなる最適化が進んでいくでしょう。
ただし、MavenやGradle、OSGiに備わっている機能はないため、もし必要であれば併用する必要があります。
手軽にコードを実行可能な「JShell」
「JShell」とは簡単に言えば、Javaコードをコンパイルすることなく即時に実行できる環境です。ただし、このツールを使った実運用が想定されているわけではなく、あくまで学習、もしくはちょっとした検証のために実行できる環境です。このような環境をREPL(Read-Eval-Print-Loop、対話型環境)といいます。
一般的にJavaの開発者や学習者は、何らかのIDEを使い、そこでコードを記述していると思います。そのような方は必要性をあまり感じないかもしれませんが、今ではREPL環境が用意されている言語が一般的になりつつあり、最近では学習面まで考慮されています。
Javaもこの流れの中で今回、REPLであるJShellが用意されました。これまでリスト1のコードを実行するには、mainメソッドを定義し、javacでコンパイルし、さらにその後実行しなければなりませんでした。これではコードの実行の確認までかなりの工程が必要になり、手間がかかります。しかし、JSehllを使用すると図3のようにサンプルコードがすぐ動くようになります。
System.out.println("Hello World")
本記事のような技術記事を読んだりするケースでも、実際のサンプルコードがそのまま実行できるようになるため、学習者はより手軽に学ぶことができます。
もちろん、ちょっとしたコード検証でも活用できるため、すでにJavaを本格的に使っている方にとっても有効なツールであることは間違いありません。
また、このJSehllはツールとしてではなく、APIとして利用することも可能です。そのため、今後はブラウザから実行できるツールが世に出てくると思います。