SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Java 9で「変わること」と、Javaのこれまで

Java 9のモジュール機能「Project Jigsaw」の基本を紹介

Java 9で「変わること」と、Javaのこれまで 第2回

  • このエントリーをはてなブックマークに追加

 前回はJava 9のリリース概要を紹介しました。今回からは変更された部分について、実際のコードを交えながら解説していきます。まずはJava 9で新たに追加された「Project Jigsaw」モジュール機能について、基本的な部分を紹介します。

  • このエントリーをはてなブックマークに追加

はじめに

 モジュール機能はJava 9にとって最も大きな変更といえます。コードだけを見ると、ほんのわずかな違いに思えますが、その意味を知れば知るほど、この変更によるJava自身の変化の大きさに気づくのではないかと思います。

 また、このモジュール機能は、機能の追加というよりもポリシー自体の変更と表現したほうが適切でしょう。それは、既存の環境だけではなく新しい環境に対して必要なことであり、Javaの用途がさらに広がったことを意味するのではないかと思います。

対象読者

  • Java関連に携わる開発者
  • これからJavaを学ぼうと思っている方

モジュール機能「Project Jigsaw」とは(1)

 Javaでこれまでモジュールといえばパッケージの概念と同じでした。しかしJava 9ではパッケージとは別に、モジュールという新たな概念が追加されています。

 Javaのクラスやメソッド、そしてフィールドなどには、公開範囲を定義するためのprivateやpublicといった定義がありました。しかし、パッケージについては「どのパッケージを参照すればいいか」や「どのパッケージは利用してはいけないか」の定義はありませんでした。

 これらのパッケージの使用可否は、実行時にクラスパスに追加されているかどうかで判定していました。しかしJava 9のモジュール機能では、プログラミング時にパッケージ単位で参照を制限することができます。

 例えば、ライブラリ開発時にもモジュールを使用することによって、ライブラリ内で使っているpublicなクラスをライブラリ利用者に対して公開しないといったことが可能になります。これはモジュール機能のひとつに過ぎませんが、開発者にとっては最もわかりやすい機能といえるでしょう。

 モジュール機能がカバーする範囲は広いですが、作成するために必要な手順はそれほど多くありません。実際にモジュール機能で何ができるかは、説明のみだと少々わかりにくいため、実際に作りながら確認していきます。

モジュール定義ファイルの概要

 早速、モジュールの定義方法を紹介します。モジュールを定義する方法は非常に簡単で、ソースフォルダ(より正しくは/classesフォルダの配下)の直下に「module-info.java」という名前のモジュール定義ファイルを用意します。モジュール定義ファイルには、以下の内容を宣言します。

  • どのモジュールを使うかの宣言
  • どのパッケージを他のモジュールに対して公開するかの宣言

 したがって、基本的な考え方はあまり難しくありません。

 モジュール定義ファイル内で利用するモジュールを宣言する場合は、リスト1の通りにrequiresを使って宣言します。これは「com.coltware.mainモジュールでjava.sql、com.colware.modを使います」という意味を表します。

リスト1 モジュールを使う場合の宣言方法例
module com.coltware.main {
    requires java.sql;
    requires com.coltware.mod;
}

 モジュール名がパッケージ名と一致しているため、利用するパッケージを宣言しているように見えます。しかし、パッケージ名とモジュール名は必ずしも同じにする必要はなく、モジュール名は自由につけることができます。

 次回説明予定ですが、Java 9のモジュールに対応していないライブラリを使うケースもあります。その場合は、ファイル名の一部が自動的にモジュール名になります。

 ここではパッケージ名ではなくモジュール名だという点に注意してください。ただし、モジュール名はパッケージ名と同じであるほうが、対応関係を類推しやすくもなります。JDK内部でも、パッケージ名を元にしたモジュール名が定義されているため、これに沿うようにしたほうが無難でしょう。

Note

 モジュール定義ファイルに似た仕組みとしてパッケージごとに配置できるpackage-info.javaがありますが、module-info.javaファイルはソースフォルダ配下に1つしか置けません。

module-info.javaの作り方

 実際にコードを記述する際には、IDEを使っているケースが多いと思います。使っているIDEによっても、このmodule-info.javaの作り方が異なります。

 例えば、Eclipseの場合にはソースフォルダ(デフォルトパッケージ)直下にて、図1のように通常のファイル作成で行います。

図1 Eclipseの場合のmodule-info.javaファイルの作成(1)
図1 Eclipseの場合のmodule-info.javaファイルの作成(1)

 通常のファイル作成のダイアログが表示されたところで、図2のようにmodule-info.javaというファイル名でファイルを作成します。

 ファイル作成で行っているため、ファイルの中身は空の状態で作成されます。クラス作成などのようにテンプレートは用意されていません。

図2 Eclipseの場合のmodule-info.javaファイルの作成(2)
図2 Eclipseの場合のmodule-info.javaファイルの作成(2)

 ただし、Eclipse内ではこのmodule-info.javaというファイルがあればモジュール機能が有効になります。

 例えば、利用を宣言していないパッケージをimportしようとすると図3のエラーが表示されます。このエラー内容の「Add 'requires [package名] to module-info.java file」をクリックすると、そのままmodule-info.javaファイル内にコードが追加されます。しかし、module-info.javaファイルがないとこのエラーは表示されず、モジュールの機能が有効になっていないことがわかります。

 また、Eclipseの場合にはmodule-info.javaというファイルがどこにあってもエラーにはなりません。ただし、実際にパッケージングする際には正常に動作しなくなるため注意が必要です。

図3 eclipseで宣言していないパッケージを記述したときのエラー例
図3 eclipseで宣言していないパッケージを記述したときのエラー例

 module-info.javaファイル自体でSyntaxエラーになる場合には、利用しているJREのバージョンが9であることを確認してください。

 また、筆者はIntelliJ IDEAも使います。こちらのほうがJava 9への対応度が高い印象を受けます。例えば、図4のようにコンテキストメニューにmodule-info.javaファイルを作成するメニューが表示されます。

図4 IntelliJを使ったときのmodule-info.javaを作成する方法
図4 IntelliJ IDEAを使ったときのmodule-info.javaを作成する方法

 ただし、利用するJDKのバージョンがJava 9になっていない場合や、ソースフォルダの直下でないところでファイルの作成を試みても、このmodule-info.javaの作成のメニューは表示されません。

 このように、利用するIDEによっては癖もあるため、IDEを使って試す場合は気をつけてください。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
モジュール機能「Project Jigsaw」とは(2)

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Java 9で「変わること」と、Javaのこれまで連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10524 2017/11/24 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング