概要

Java プラットフォームモジュールシステム(JPMS)は、Java 9 で導入されました。 これにより、関連するパッケージのセットをモジュールと呼ばれる上位レベルのコンポーネントにグループ化することで コードを整理でき、モジュール間の依存関係を宣言するメカニズムが提供されます。


アプリケーションをモジュール化すると、次のようないくつかの利点があります。

 - コードがモジュールに編成されているアプリケーションは、読みやすく、保守しやすく、拡張性が高くなります。

 - モジュール間の依存関係は、コンパイル時とアプリケーションの起動時の両方でチェックされるモジュール記述子によって定義されます。 この依存関係の早期解決により、ランタイムの信頼性が向上し、「NoClassDefFoundError」例外がアプリケーション クラッシュの一般的な原因となっていた Java の長年の問題が解決されます。

 - モジュール内のパッケージは、明示的にエクスポートされた場合にのみ、他のモジュールからアクセスできます。 強力なカプセル化と呼ばれるこの原則は、リフレクションが侵入できない安全なスペースをコードにデフォルトで提供します。

 - 最後に、モジュールシステムを使用すると、アプリケーションで使用されるモジュールのみを含むカスタムランタイムイメージを作成できます。 ランタイム環境のサイズが縮小されたことにより、アプリケーションの起動時間とメモリーフットプリントが大幅に改善されました。


Wrapper ver. 3.5.55 以降、wrapper.jar ファイルには 「org.tanukisoftware.wrapper」モジュールを導入するモジュール記述子が含まれています。 この名前付きモジュールは、jlink で作成されたカスタム ランタイムイメージに含めることができます。

警告

Wrapper ver. 3.5.55 より前は、「wrapper.jar」ファイルはモジュール式ではありませんでした。 モジュールパスで参照されると、「wrapper」という名前の自動モジュール (JAR ファイルの名前から派生) が作成されました。 この自動モジュールは他のモジュール宣言で使用できますが、ランタイムイメージを作成するために jlink で使用することはできません。

モジュール記述子の一部で「wrapper」が使用されており、Wrapper ver. 3.5.55 以降にアップグレードする場合は、 名前を「org.tanukisoftware.wrapper」に必ず変更してください。


Wrapper には、アプリケーションによるモジュールの使用方法を設定するのに役立ついくつかのプロパティが用意されています。

注意

これらのプロパティは、Java 9 以降のバージョンで実行する場合にのみ使用されます。 以前のバージョンでは無視されます。

wrapper.java.module_path.<n> プロパティ群

対応バージョン :3.5.55(Java 9 以上が必要)
対応エディション :プロフェッショナル版スタンダード版コミュニティー版
対応プラットフォーム :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

これらのプロパティは、アプリケーションのモジュールが見つかる場所をリスト化するために使用されます。 そのリストにはディレクトリ、またはオプションでファイル名部分にワイルドカードを含む jar ファイルへのパスを含めることができます。

Wrapper はこのリストを使用して、Java コマンドラインの「--module-path」オプションを構築します。

モジュールパスエントリ内でワイルドカード文字が使用されている場合、 一致するすべてのファイルは、JVM インスタンスの起動時に使用されるモジュールパスに追加されます。

有効なワイルドカード文字は、

  • 「 [*] 」文字で、「0」(ゼロ)以上の文字と一致します。
  • 「 [?] 」 文字で、1 つの文字と正確に一致します。

モジュールパス要素の可能な値の例:
wrapper.java.module_path.1=../lib/myapp-*.jar  # ワイルドカードで指定された jar ファイル
wrapper.java.module_path.2=../lib/tools.jar    # 正確な名前を使用して指定された単一の jar ファイル
wrapper.java.module_path.3=../lib/ext          # 追加のモジュールが存在するフォルダー

注意

このプロパティリストの値に「wrapper.jar」を含めないでください。 存在する場合、コンフィギュレーションをロードするときにリストから削除されます。

Wrapper は、[wrapper.jarfile]プロパティを使用して、 モジュールが使用されているかどうかに応じて、コマンドラインの正しい場所に「wrapper.jar」ファイルを自動的に追加します。


クラスパス:

Java では、同じパッケージを含む 2 つの異なる jar ファイルがモジュールパスリスト内に共存することは許可されません。 これは、歴史的にパッケージの重複は常に許可されてきたクラスパスとは異なります。 これが、少なくともアプリケーションが Java 9 モジュールシステムに完全に移行できるまでは、クラスパスが有用であり続ける理由の 1 つです。

次の制限に注意してください。クラスパスにリストされ、モジュールパスのどの場所にも見つからない jar ファイルは、JVM によって 名前のないモジュールとして使用され、その性質上、他のモジュールからアクセスできなくなります。 モジュールが別のモジュールの requires ディレクティブで参照されることになっている場合、そのモジュールは[wrapper.java.module_path.<n>]または[wrapper.java.upgrade_module_path.<n>]プロパティで指定された場所のいずれかに存在する必要があります。


問題?

モジュールパスに関連する問題が発生した場合、最初に行うべきことは、Wrapper によって生成されている完全なモジュールパスを確認することです。 これを行うには、[wrapper.debug]プロパティを使用してデバッグログの出力を有効にするか、[wrapper.java.command.loglevel]プロパティを使用して Java コマンドの表示を有効にします。

注意

スペースを含むモジュールパス:

Wrapper は、スペースを含むモジュールパス要素を正しく処理します。 これは、最終的に生成されたモジュールパスを引用符で囲むことによって、 Wrapper によって後で行われます。 個々のモジュールパス要素のプロパティ値は、スペースが含まれている場合でも、引用符を含めて定義しないでください。

wrapper.java.module_path.missing.loglevel

対応バージョン :3.5.55(Java 9 以上が必要)
対応エディション :プロフェッショナル版スタンダード版コミュニティー版
対応プラットフォーム :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

デフォルトでは、Wrapper は、不足しているモジュールパス要素に関する警告を 「 [DEBUG] 」ログレベルで記録します。 すべてのデバッグ出力を有効にせずに、これらの生成されたログメッセージを確認したい場合は、非常に一般的です。 このプロパティを使用すると、警告が記録されるログレベルを指定できます。

有効なプロパティー値は次のとおり:
  • [FATAL] :
    FATAL ログレベルでログを記録します。
  • [ERROR] :
    ERROR ログレベルでログを記録します。
  • [WARN] :
    WARN ログレベルでログを記録します。
  • [STATUS] :
    STATUS ログレベルでログを記録します。
  • [INFO] :
    INFO ログレベルでログを記録します。
  • [DEBUG] :
    DEBUG ログレベルでログを記録します。
  • [NONE] :
    - ログを記録しません。

デフォルト値は[DEBUG]です。

設定例:
wrapper.java.module_path.missing.loglevel=DEBUG

アプリケーションで jar が頻繁に欠落する場合は、この値を「NONE」に設定すると、どのログレベルでも警告が無効になります。

ワイルドカードとして定義されたモジュールパス要素では、ワイルドカードが少なくとも 1 つのファイルと一致しない場合にも警告がログに記録されます。 これは、ディレクトリが存欠落している場合や空である場合に起こる可能性があります。

wrapper.java.upgrade_module_path.<n>

対応バージョン :3.5.55(Java 9 以上が必要)
対応エディション :プロフェッショナル版スタンダード版コミュニティー版
対応プラットフォーム :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

これらのプロパティは、[wrapper.java.module_path.<n>]に似たリストを定義しますが、ランタイムイメージに含まれるアップグレード可能なモジュールをオーバーライドできます。

wrapper.java.module_path.<n>]の場合と同様に、リストにはディレクトリ、またはファイル名部分にオプションでワイルドカードを含む jar ファイルへのパスを含めることができます。構文の詳細については、上記のセクションを参照してください。

Wrapper はこのリストを使用して、Java コマンドラインの「--upgrade-module-path」オプションを構築します。

注意

このプロパティ リストの値にファイルを含める必要はありません。 The wrapper.jar doesn't need to be included in the values of this property list.

Wrapper は、[wrapper.jarfile]プロパティを使用して、モジュールが使用されているかどうかに応じて、コマンド ラインの適切な場所に wrapper.jar を自動的に追加します。

wrapper.java.upgrade_module_path.missing.loglevel

対応バージョン :3.5.55(Java 9 以上が必要)
対応エディション :プロフェッショナル版スタンダード版コミュニティー版
対応プラットフォーム :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

デフォルトでは、Wrapper はアップグレードモジュールパス要素が不足している場合に [DEBUG] ログレベルで警告を記録します。 すべてのデバッグ出力を有効にせずに、生成されたログメッセージを表示したい場合がよくあります。 このプロパティを使用すると、警告が記録されるログレベルを指定できます。

有効なプロパティー値は次のとおり:
  • [FATAL] :
    FATAL ログレベルでログを記録します。
  • [ERROR] :
    ERROR ログレベルでログを記録します。
  • [WARN] :
    WARN ログレベルでログを記録します。
  • [STATUS] :
    STATUS ログレベルでログを記録します。
  • [INFO] :
    INFO ログレベルでログを記録します。
  • [DEBUG] :
    DEBUG ログレベルでログを記録します。
  • [NONE] :
    - ログを記録しません。

デフォルト値は[DEBUG]です。

設定例:
wrapper.java.upgrade_module_path.missing.loglevel=DEBUG

アプリケーションで jar が頻繁に欠落する場合は、この値を「NONE」に設定すると、どのログレベルでも警告が無効になります。

ワイルドカードとして定義されているアップグレードモジュールパス要素では、ワイルドカードが少なくとも 1 つのファイルと一致しない場合にも警告がログに記録されます。 これは、ディレクトリが存欠落している場合や空である場合に起こる可能性があります。

wrapper.java.module.<n>

対応バージョン :3.5.55(Java 9 以上が必要)
対応エディション :プロフェッショナル版スタンダード版コミュニティー版
対応プラットフォーム :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/Linux

これらのプロパティは、アプリケーションで使用されるルートモジュールの名前を一覧表示するために使用されます。 ルートモジュールは、他のモジュールによって必要とされないか、オプションの依存関係 (つまり、モジュール記述子で「requires static」で指定されている) であるため、アプリケーションの起動時にモジュールグラフにプルできないモジュールです。

Wrapper はこのリストを使用して、コマンドラインの「--add-modules」オプションを構築します。

モジュール名に加えて、リストには次のトークンを含めることができます。

詳しい説明についてはJDK 仕様を参照してください。