Java 9のその先へ~JavaOne Conference 2017レポート

第3回 Java 9のモジュール機能で何が変わるのか[JavaOne2017]

この記事を読むのに必要な時間:およそ 4 分

既存のアプリケーションをモジュール対応にするには

Java 8以前に作られた既存のアプリケーションやライブラリをモジュールに対応させるには,まずそのアプリケーションやライブラリがどんなモジュールに依存しており,どの機能を外部に公開するのかを明確にすることから始まります。

クラスファイルやライブラリ,モジュールの依存関係を調べるには,jdepsコマンドを使うと便利です。次の例は,myapp.jarとmylib.jarについて依存関係を調べたものです。

jdepsコマンドでjarファイルの依存関係を調べる

jdepsコマンドでjarファイルの依存関係を調べる

mylib.jarはjava.baseモジュールに依存しており,myapp.jarはjackson-core-2.6.2.jar,jackson-databind-2.6.2.jar,mylib.jar,java.baseモジュール,java.sqlモジュールにそれぞれ依存していることがわかります。jackson-core-2.6.2.jarとjackson-databind-2.6.2.jarはサードパーティ製のライブラリです。もしこれらのライブラリがすでにモジュールに対応している場合(モジュール定義情報がある場合)には,それぞれのmodule-info.javaはたとえば次のように書けばいいということになります。

mylibのモジュール定義の例

mylibのモジュール定義の例

myappのモジュール定義の例

myappのモジュール定義の例

しかし,もし依存しているjarファイルの中にモジュール定義情報がないものが含まれていた場合はどうでしょうか。モジュール定義情報が無いjarファイルは,内部的に"automatic module"と呼ばれるモジュールとして使えるようになっています。automatic moduleは次のような特徴を持っています。

  • モジュール名はMANIFEST.MFのAutomatic-Module-Nameの設定によって決まる。MANIFEST.MFに記載が無い場合はjarファイル名が使われる
  • すべてのパッケージが外部にexportsされている状態になる
  • すべての他のモジュールをrequiresしている状態になる

このautomatic moduleの仕組みによって,モジュール対応が済んでいないライブラリも,元のjarファイルに手を加えることなくモジュール化されたアプリケーションで使うことができるようになっています。

標準ライブラリがモジュール化された影響

Java 9への対応でもう1つ注意しなくてはならないことが,前述のようにJDKの標準ライブラリそのものが小さなモジュールに分割され,公開範囲や依存関係が明確に指定されているということです。中でもとくに気をつけなくてはいけない点として,次の2つの項目が挙げられています。

注意点1:Java EE関連APIのモジュールが非推奨になった

従来のJDKにはJava EEに由来するサーバサイド向けのAPIがいくつか含まれていましたが,それらが非推奨となり,将来的にはJava SE自体からも削除されます。現在はまだJava SEの一部ではありますが,デフォルトでは読み込まれないモジュールになりました。対象のモジュールは次のようなものです。

  • java.activation
  • java.corba
  • java.transaction
  • java.xml.bind
  • java.xml.ws
  • java.xml.ws.annotation

注意点2:JDKの内部クラスが利用できなくなる

JDKには本来は一般的に利用されることを想定していない,内部の処理のみで使うためのクラスが含まれています。しかし従来のパッケージベースのアクセス権管理だけでは,言語仕様として利用不可とすることはできなかっため,現実にはそのような内部クラスを利用しているアプリケーションやライブラリが多数存在します。

これらの内部クラスは,Java 9ではモジュール機能によって外部公開されないように設定されました。したがって,もし利用しているアプリケーションやライブラリは,Java 9に移行するにあたって代替のクラスを使うように修正する必要があります。

最もわかりやすい変更は,これまでJDKの標準APIのパッケージがまとめられていた「rt.jar」というファイルが無くなりました。したがってこのファイルを直接クラスパスに指定して実行しているようなアプリケーションは起動できません。また,⁠sun.security」のようなパッケージもアクセスできなくなっているため,代替のものに置き換える必要があります。

著者プロフィール

杉山貴章(すぎやまたかあき)

有限会社オングス所属。Javaやシェルスクリプトによるソフトウェア開発を手がけるかたわら,プログラミング関連書籍やIT系雑誌記事,ニュース記事などの執筆などを行っている。著書に『正規表現書き方ドリル』(2010年,技術評論社),『図解クラウド 仕事で使える基本の知識』(2011年,技術評論社)などがある。

コメント

コメントの記入