はじめに
この包括的なチュートリアルでは、Java モジュールパスの設定の詳細を探求し、Java 9 で導入された Java モジュールシステムに関する重要な知見を開発者に提供します。モジュールパスの設定と管理を理解することで、プログラマーはコードの整理を強化し、依存関係の管理を改善し、よりモジュール化された保守可能な Java アプリケーションを作成することができます。
この包括的なチュートリアルでは、Java モジュールパスの設定の詳細を探求し、Java 9 で導入された Java モジュールシステムに関する重要な知見を開発者に提供します。モジュールパスの設定と管理を理解することで、プログラマーはコードの整理を強化し、依存関係の管理を改善し、よりモジュール化された保守可能な Java アプリケーションを作成することができます。
Java 9 で導入された Java モジュールは、Java の依存関係管理とカプセル化の改善に対するアプローチに根本的な変化をもたらしました。これらは、アプリケーションの異なる部分間のアクセスを整理し、制御するためのより構造化された方法を提供します。
Java モジュールは、名前付きで自己記述的なコードとデータの集合です。これは明示的に以下を宣言します。
特性 | 説明 |
---|---|
明示的な依存関係 | モジュールは依存関係を宣言する必要があります |
強力なカプセル化 | 内部パッケージの可視性を制御します |
パフォーマンスの向上 | より良いランタイム最適化を実現します |
モジュールは、モジュールのルートにある特別な module-info.java
ファイルによって定義されます。
module com.example.mymodule {
// Module directives go here
requires java.base; // Implicit requirement
requires java.sql; // Explicit dependency
exports com.example.api; // Packages visible to other modules
exports com.example.services to com.example.client; // Restricted exports
}
module-info.java
で明示的に定義されますこれは、LabEx プロジェクトのシンプルなモジュール構造です。
// module-info.java in src directory
module com.labex.moduleexample {
requires java.base;
requires java.logging;
exports com.labex.core.api;
exports com.labex.core.services;
}
Ubuntu 22.04 では、以下のコマンドを使用してモジュールをコンパイルし、実行します。
## Compile modules
javac -d mods --module-source-path src $(find src -name "*.java")
## Run a specific module
java --module-path mods -m com.labex.moduleexample/com.labex.core.Main
モジュールパスは Java のモジュールシステムにおける重要な概念であり、Java モジュールを検索およびロードするためのランタイム場所として機能します。
クラスパス | モジュールパス |
---|---|
従来の依存関係解決 | モジュール対応の依存関係管理 |
明示的なモジュール境界がない | 明示的なモジュール宣言 |
アクセス制御が緩い | 強力なカプセル化 |
project/
├── src/
│ └── com.labex.module/
│ ├── module-info.java
│ └── com/
│ └── labex/
│ └── module/
│ └── Main.java
└── mods/
## Compile modules
javac -d mods --module-source-path src $(find src -name "*.java")
## Run with explicit module path
java --module-path mods -m com.labex.module/com.labex.module.Main
## Set JAVA_MODULE_PATH
export JAVA_MODULE_PATH=/path/to/modules
## Use in compilation
javac --module-path $JAVA_MODULE_PATH
## Combine multiple module directories
java --module-path mods:external_libs -m module.name/main.class
## LabEx module path setup
mkdir -p /home/labex/projects/mymodule/src
mkdir -p /home/labex/projects/mymodule/mods
## Compile modules
javac -d /home/labex/projects/mymodule/mods \
--module-source-path /home/labex/projects/mymodule/src \
$(find /home/labex/projects/mymodule/src -name "*.java")
jdeps
を使用して依存関係を分析する## List available modules
java --list-modules
## Analyze module dependencies
jdeps -s mymodule.jar
--module-path
を適切に使用するlabex-project/
├── src/
│ ├── com.labex.core/
│ │ ├── module-info.java
│ │ └── com/labex/core/
│ ├── com.labex.service/
│ │ ├── module-info.java
│ │ └── com/labex/service/
└── mods/
module com.labex.core {
// Explicit module dependencies
requires java.base;
requires java.sql;
// Export specific packages
exports com.labex.core.api;
exports com.labex.core.utils to com.labex.service;
// Use services
uses com.labex.service.DatabaseProvider;
provides com.labex.service.DatabaseProvider
with com.labex.core.impl.DefaultDatabaseProvider;
}
相互作用の種類 | 説明 | 使用例 |
---|---|---|
Requires | 直接の依存関係 | 外部モジュールの機能にアクセスする |
Exports | パッケージの可視性 | 特定のパッケージを共有する |
Uses/Provides | サービスのロード | プラグインアーキテクチャを実装する |
// Service interface
module com.labex.service {
exports com.labex.service.spi;
uses com.labex.service.spi.Plugin;
}
// Service implementation
module com.labex.plugin {
requires com.labex.service;
provides com.labex.service.spi.Plugin
with com.labex.plugin.DefaultPlugin;
}
## Compile modules
javac -d mods \
--module-source-path src \
$(find src -name "*.java")
## Run modular application
java --module-path mods \
-m com.labex.core/com.labex.core.Main
exports
: 特定のモジュールにパッケージを公開するopens
: ランタイムリフレクションを許可するrequires
: モジュールの依存関係を宣言する// module-info.java for LabEx application
module com.labex.application {
// Core module dependencies
requires java.base;
requires java.logging;
// Service integration
uses com.labex.service.UserService;
// Exported packages
exports com.labex.application.core;
exports com.labex.application.utils;
}
jlink
を使用してカスタムランタイムイメージを作成する## Module dependency analysis
jdeps -v mymodule.jar
## Runtime module information
java --describe-module com.labex.core
Java モジュールパスの設定を習得することは、現代の Java 開発において重要です。このチュートリアルでは、モジュールパスを効果的に設定、構成、活用するための基本的な技術を学びました。これらの戦略を適用することで、開発者は Java モジュールシステムの強力な機能を最大限に活用した、より堅牢で拡張性があり、構造が良好な Java アプリケーションを作成することができます。