80

Java のパッケージ管理システムは、私にとって常にシンプルで効果的なものに思えました。JDK自体によって頻繁に使用されます。名前空間とモジュールの概念を模倣するためにこれを使用してきました。

Project Jigsaw (別名Java Platform Module System )は何を入力しようとしていますか?

公式サイトより:

このプロジェクトの目標は、Java SE プラットフォームの標準モジュール システムを設計および実装し、そのシステムをプラットフォーム自体および JDK に適用することです。

4

5 に答える 5

101

Jigsaw と OSGi は、同じ問題を解決しようとしています。つまり、内部をシールドしながら粗粒度のモジュールが相互作用できるようにする方法です。

Jigsaw の場合、粒度の粗いモジュールには、Java クラス、パッケージ、およびそれらの依存関係が含まれます。

次に例を示します。Spring と Hibernate。どちらもサードパーティの JAR CGLIB に依存していますが、その JAR の互換性のない異なるバージョンを使用しています。標準の JDK に頼ると何ができるでしょうか? Spring が必要とするバージョンを含めると、Hibernate が壊れ、その逆も同様です。

ただし、Jigsaw のような高レベルのモデルがある場合は、さまざまなモジュールでさまざまなバージョンの JAR を簡単に管理できます。それらを高レベルのパッケージと考えてください。

GitHub ソースから Springをビルドすると、Springも表示されます。彼らはフレームワークを作り直したので、コア、永続化などのいくつかのモジュールで構成されています。アプリケーションが必要とするモジュールの依存関係の最小限のセットを選択して選択し、残りを無視することができます。以前は、すべての .class ファイルを含む単一の Spring JAR でした。

更新: 5 年後 - Jigsawには解決すべき問題がいくつか残っている可能性があります。

于 2012-08-07T11:27:14.930 に答える
45

私の知る限り、計画はJREをよりモジュール化することです。つまり、オプションの小さい jar があり、必要な機能のみをダウンロード/アップグレードできます。

肥大化を抑え、おそらくほとんどの人が使用しないレガシーモジュールをドロップするオプションを提供するためです。

于 2012-08-07T11:27:33.413 に答える
44

Devoxx Belgium でのMark Reinhold基調講演に基づいて、Project Jigsawは 2 つの主要な問題点に対処します。

  1. クラスパス
  2. 大規模なモノリシック JDK

クラスパスの何が問題になっていますか?

私たちは皆、 JAR 地獄について知っています。この用語は、クラスローディングプロセスが機能しなくなるさまざまな状況をすべて表しています。クラスパスの最もよく知られている制限は次のとおりです。

  • 競合があるかどうかを判断するのは困難です。Maven のようなビルド ツールは、アーティファクト名に基づいてかなりうまく機能しますが、アーティファクト自体が異なる名前で同じ内容を持っている場合、競合が発生する可能性があります。
  • jar ファイルの根本的な問題は、それらがコンポーネントではないことです。それらは、直線的に検索されるファイル コンテナーの集まりにすぎません。クラスパスは、クラスが含まれているコンポーネント、含まれているパッケージ、または使用目的に関係なく、クラスを検索する方法です。

大規模なモノリシック JDK

JDK の大きなモノリシックな性質は、いくつかの問題を引き起こします。

  • 小型のデバイスには適合しません。小さなIoTタイプのデバイスにはSEクラスのVMを実行できるプロセッサがありますが、特にアプリケーションがJDKのごく一部しか使用しない場合、すべてのJDKを保持するためのメモリが必ずしもありません.
  • クラウドでも問題です。クラウドは、ハードウェアの使用を最適化することがすべてです。JDK 全体を含む何千ものイメージがあり、アプリケーションがその一部しか使用しない場合、それは無駄になります。

モジュール: 一般的なソリューション

上記の問題に対処するために、モジュールを基本的な新しい種類の Java プログラム コンポーネントとして扱います。モジュールは、コードとデータの名前付き自己記述型コレクションです。そのコードは、タイプ、つまり Java クラスとインターフェースを含むパッケージのセットとして編成されています。そのデータには、リソースやその他の種類の静的情報が含まれます。

そのコードが他のモジュールの型を参照する方法を制御するために、モジュールは、コンパイルして実行するために必要な他のモジュールを宣言します。他のモジュールのコードがそのパッケージの型を参照する方法を制御するために、モジュールはエクスポートするパッケージを宣言します。

モジュール システムは、必要なモジュールを検索し、クラスパス メカニズムとは異なり、モジュール内のコードが依存するモジュール内の型のみを参照できるようにします。Java 言語と Java 仮想マシンのアクセス制御メカニズムにより、定義モジュールによってエクスポートされていないパッケージ内の型にコードがアクセスできなくなります。

信頼性が高くなるだけでなく、モジュール性によってパフォーマンスが向上する可能性があります。モジュール内のコードがパッケージ内の型を参照する場合、そのパッケージは、そのモジュールまたはそのモジュールによって読み取られるモジュールの正確に 1 つのいずれかで定義されることが保証されます。したがって、特定のタイプの定義を検索するときに、複数のモジュールで検索する必要はなく、さらに悪いことに、クラス パス全体に沿って検索する必要もありません。

フォローするJEP

ジグソーは、かなりの数年間進行中の巨大なプロジェクトです。プロジェクトに関するより多くの情報を得るのに最適な場所である JEP が非常に多くあります。これらの JEP の一部は次のとおりです。

  • JEP 200: モジュール式 JDK : Java Platform Module System (JPMS) を使用して JDK をモジュール化する
  • JEP 201: Modular Source Code : JDK ソース コードをモジュールに再編成し、ビルド システムを拡張してモジュールをコンパイルし、ビルド時にモジュール境界を適用します。
  • JEP 261: Module System : JSR 376 で指定されている Java Platform Module System を、関連する JDK 固有の変更と拡張とともに実装します。
  • JEP 220: Modular Run-Time Images : JDK および JRE ランタイム イメージを再構築して、モジュールに対応し、パフォーマンス、セキュリティ、保守性を向上させます
  • JEP 260: ほとんどの内部 API をカプセル化する: JDK の内部 API のほとんどをデフォルトでアクセスできないようにしますが、機能のすべてまたはほとんどに対してサポートされている代替品が存在するまで、いくつかの重要で広く使用されている内部 API をアクセス可能なままにします
  • JEP 282: jlink: The Java Linker : JEP 220で定義されているように、一連のモジュールとその依存関係をカスタム ランタイム イメージにアセンブルおよび最適化できるツールを作成します。

閉会の辞

The State of the Module Systemレポートの初版で、Mark Reinhold はモジュール システムの具体的な目標を次のように説明しています。

  • Reliable configuration。脆弱でエラーが発生しやすいクラスパス メカニズムを、プログラム コンポーネントが相互に明示的な依存関係を宣言する手段に置き換えます。
  • 強力なカプセル化。コンポーネントが、他のコンポーネントからアクセスできるパブリック タイプとアクセスできないパブリック タイプを宣言できるようにします。

これらの機能は、アプリケーション開発者、ライブラリ開発者、および Java SE プラットフォーム自体の実装者に直接的および間接的に利益をもたらします。これは、スケーラブルなプラットフォーム、プラットフォームの完全性の向上、およびパフォーマンスの向上が可能になるためです。

于 2016-01-15T14:47:41.793 に答える
3

この記事では、OSGi と JPMS/Jigsaw の両方が解決しようとしている問題について詳しく説明します。

「Java 9、OSGi、およびモジュール性の未来」 [2016 年 9 月 22 日]

また、OSGi と JPMS/Jigsaw の両方のアプローチについても徹底的に説明します。現時点では、成熟した (16 歳の) OSGi と比較して、著者は JPMS/Jigsaw の実用的な長所をほとんど挙げていないようです。

于 2016-11-11T06:20:35.313 に答える