web-dev-qa-db-ja.com

モジュールとJARファイルの違いは何ですか?

私はJava 9から Java9の新機能 について学んでいます。議論のホットなトピックの1つはThe Modular JDK

JARファイルはモジュールですか?

モジュールはJARファイルとどう違うのですか?

20
Neeraj Jain

Module:新しいlanguage機能がJava 9(クラス、インターフェイス、パッケージなどに似ています)パッケージのコレクションで構成され、パッケージがタイプのコレクションで構成されている方法に似ています。

[〜#〜] jar [〜#〜]:コードとリソースをバンドルし、JVMによってロードできるアーカイブファイル形式。

より具体的には、モジュールは 次のように定義されます です。

開発者に親しみやすく、既存のツールチェーンでサポート可能な方法で信頼性の高い構成と強力なカプセル化を提供するために、モジュールを基本的な新しい種類のJavaプログラムコンポーネントとして扱います。Amoduleは、名前付きの自己記述型のコードとデータのコレクションです。そのコードは、タイプを含むパッケージのセットとして編成されます。つまり、Javaクラスとインターフェース。そのデータにはリソースやその他の種類の静的情報が含まれます。

...

モジュールの自己記述は、モジュール宣言、Javaプログラミング言語の新しい構成体)で表現されます。

...

モジュール宣言は、慣例により、module-info.classという名前のファイルにコンパイルされ、同様にクラスファイル出力ディレクトリに配置されます。

モジュールをJarファイルにコンパイルできます。この場合、Jarファイルにはmodular Jar fileというラベルが付けられます。

既存のツールはすでにJARファイルを作成、操作、および使用できるため、採用と移行を容易にするために、モジュラーJARファイルを定義します。モジュラーJARファイルは、ルートディレクトリにmodule-info.classファイルも含まれていることを除いて、あらゆる点で通常のJARファイルに似ています。

モジュールとJARのその他の違い:

  1. モジュールは、必要なモジュールによる依存クラスへのアクセスを許可するために、他のモジュールをrequireできます。 Jarには、このような依存関係の概念はありません。

  2. モジュールは、それを必要とする他のモジュールにエクスポートするクラスとインターフェースを決定できます。 Jarには、このようなカプセル化メカニズムはありません。

  3. モジュールはモジュラーJarファイルにコンパイルできますが、一部のモジュール(JDKモジュールなど)はJMODと呼ばれる別の形式にコンパイルされます。

  4. JARの名前は変更できます。 JVMクラスローダーがクラスパスで必要なクラスを見つける限り(単一のJAR、複数のJAR、またはディレクトリまたはJARの混合で構成できます)、JARファイルの名前は何でもかまいません。ただし、モジュールの名前は他のモジュールの宣言で明示的に参照できます。そのような名前はそれを定義し、自由に変更することはできません。

15
manouti

厳密に言えば、moduleは実行時の概念です。他の人が モジュールシステムの状態 から引用したように:

モジュールは、コードとデータの名前付きの自己記述型コレクションです。そのコードは、タイプ、つまりJavaクラスおよびインターフェースを含むパッケージのセットとして編成されます。そのデータには、リソースおよびその他の種類の静的情報が含まれます。

これはJARと非常に似ていますが、...

  1. JARには実行時に意味のある表現がありません
  2. JARは「自己記述的」ではありません。これは、この場合、JVMが気にする名前を持たず、依存関係を表現できないか、適切なAPIを定義できないことを意味します

これにより、モジュールはどこから来るのかという疑問が残ります。さまざまな方法がありますが、開発者にとって最も顕著な方法はモジュラーJARです。 モジュラーJARは単なるJARに似ていますが、モジュール記述子を含みます、 ファイル module-info.classからコンパイルされたmodule-info.Javaモジュールの名前、依存関係、APIを定義する であるファイルです。

したがって、JARとモジュールの間には強いつながりがあります。JARは、モジュールシステムがモジュールを作成するコンテナであり、(現時点では)各JARには1つのモジュールのみを含めることができます。重要なのは、Java 9 JARでもモジュラーであるhaveではない-プレーンJARはまったく問題ありません。

8
Nicolai