大規模なJavaシステムの依存関係管理

ジム・ギャリソン:

40-50個のOSSパッケージに依存する大規模な(> 500,000 LOC)Javaシステムがあります。システムはAntで構築されており、依存関係の管理は現在手動で処理されています。依存関係を自動化するために、IvyやMavenを調査しています。昨年、Mavenをビルドオートメーションシステムと見なして、Mavenのアーキテクチャに一致するようにシステムを完全に再構築する必要があるため、それを拒否しました。現在、依存関係管理タスクのみを自動化しようとしています。

私はIvyでいくつかの実験を行いましたが、問題が発生しました。たとえば、依存関係としてActiveMQを指定し、依存関係の指定にMavenリポジトリーのPOMを使用するようにIvyに指示すると、Ivyは一連のパッケージ(Jetty、Derby、Geronimoなど)を取得します。 ActiveMQを使用します。

ivysettings.xmlでusepoms = "false"を設定すると、activemq.jarのみがフェッチされますが、それはIvyの目的に反しているようで、手動で作成した依存関係の仕様を持つ単純なjar-fetcherにそれを委任します。

ここには大きな問題があります。Windowsでは「DLL Hell」と呼ばれていました。場合によっては、2つの直接的な第1レベルの依存関係が、同じ推移的な依存関係の異なるバージョンを指します(たとえば、log4j.jar)。クラスパスに含めることができるlog4j.jarは1つだけなので、依存関係の解決には、システム内のすべてのクライアントと互換性のあるバージョンを手動で決定する必要があります。

それはすべて、各パッケージの依存関係仕様(POM)の品質に帰着していると思います。ActiveMQの場合、スコープ宣言がないため、ActiveMQへの参照は、必要でないとわかっている依存関係を手動で除外しない限り、その依存関係をすべてダウンロードします。

log4jの場合、依存関係の自動解決には、log4jのすべてのクライアント(log4jに依存する他のパッケージ)が以前のすべてのバージョンのlog4jに対して検証し、POMで互換性のあるlog4jバージョンの範囲(またはリスト)を提供する必要があります。それはおそらく質問するのが多すぎます。

これは現在の状況ですか、それとも何か不足していますか?

ロバート・ムンテアヌ:

あなたはそれを言うのは全く正しい

それはすべて、各パッケージの依存関係仕様(POM)の品質に帰着していると思います。

追加するのは、POMまたはその他の形式のメタデータを開始点として表示することだけです。たとえば、ActiveMQがすべての依存関係を提供することは非常に便利ですが、実際にプロジェクトに適しているかどうかはユーザーが選択する必要があります。

結局のところ、log4jのバージョンを考慮に入れても、外部の依存関係でバージョンを選択するのか、それとも動作することがわかっているバージョンを選択するのか?


依存関係の調整を選択する方法については、Ivyでできることは次のとおりです。

不要なパッケージ

Ivyは、ActiveMQを使用するだけでは必要ないことがわかっている多数のパッケージ(Jetty、Derby、Geronimoなど)を取得します。

これは通常、アプリケーションのモジュール性が低いために発生します。たとえば、アプリケーションの一部でJettyが必要ですが、使用しない場合でも、この一時的な依存関係が発生します。

おそらく、ツタの除外メカニズムを調べたいと思います

<dependency name="A" rev="1.0">
  <exclude module="B"/>
</dependency>

依存バージョン

クラスパスに含めることができるlog4j.jarは1つだけなので、依存関係の解決には、システム内のすべてのクライアントと互換性のあるバージョンを手動で決定する必要があります。

おそらく私はこれを誤解しているかもしれませんが、Ivyの競合解決には手動の要素はありませんデフォルトの競合マネージャーのリストがあります

  • all:この競合マネージャは、すべてのリビジョンを選択して競合を解決します。NoConflictManagerとも呼ばれ、すべてのモジュールを削除します。
  • latest-time:この競合マネージャーは「最新」のリビジョンのみを選択し、latestは最新の時間として定義されます。最新の時間は計算にコストがかかるため、可能であれば最新のリビジョンを選択してください。
  • latest-revision:この競合マネージャーは、「最新」のリビジョンのみを選択します。最新のものは、リビジョンの文字列比較によって定義されます。
  • latest-compatible:この競合マネージャーは、互換性のある一連の依存関係をもたらす可能性がある競合の最新バージョンを選択します。つまり、最終的にはこの競合マネージャは(厳密な競合マネージャのように)競合を許可しませんが、互換性のあるモジュールのセットを(バージョンの制約に従って)検索しようとするベストエフォート戦略に従います。
  • strict:この競合マネージャは、競合が検出されると必ず例外をスローします(つまり、ビルドが失敗します)。

必要に応じて、独自の競合マネージャーを提供できます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

大規模なシステム管理

分類Dev

多くのサードパーティの依存関係がある大規模なクロスプラットフォームC ++プロジェクトのディスク上の物理レイアウト

分類Dev

大規模な操作でのC ++一時停止/再開システム

分類Dev

大規模なMongoDBとの多対多の関係

分類Dev

大規模なPython依存関係をS3に保存する方法(サーバーレスのAWS Lambdaの場合)

分類Dev

大規模なシステムの設計をどのように始めますか?

分類Dev

大規模なファイルシステムのバックアップをすばやく実行する

分類Dev

Requirements.txtシステムに依存しないテンソルフローの依存関係を指定する方法

分類Dev

WebSocketの同時テストの大規模なボリューム

分類Dev

オプションのシステム依存関係により、「無効な推移的な依存関係(存在する場合)は使用できなくなります」

分類Dev

システム間の依存関係のUML図

分類Dev

Mavenへのシステム依存関係の追加

分類Dev

C ++ STLのシステムレベルの依存関係

分類Dev

Maven:複数のjarを指すシステム依存関係

分類Dev

automakeビルドシステムの内部依存関係

分類Dev

システム全体の依存関係グラフを生成する

分類Dev

複雑な相互依存関係を持つMakefileと大規模プロジェクト

分類Dev

大規模なタスクスケジューリングのためのスケーラブルなジョブキューシステム

分類Dev

大規模なMakefileプロジェクトのすべての依存関係を収集するにはどうすればよいですか?

分類Dev

Firestoreの大規模なコレクションとのレルム同期-アーキテクチャに関する質問/問題

分類Dev

オペレーティングシステムに応じたJavaの依存関係?

分類Dev

ライトスルーRAMディスク、またはファイルシステムの大規模なキャッシュ?

分類Dev

大規模なJavaプロジェクトで非常に複雑なパッケージの依存関係を作成しないようにする技術的な理由はありますか?

分類Dev

ホストシステムではなく、pbuilder環境内の依存関係を解決する

分類Dev

ホストシステムではなく、pbuilder環境内の依存関係を解決する

分類Dev

大規模なExcelスプレッドシートの作成

分類Dev

LMDB:限られたメモリシステムで大規模なデータベースを開く

分類Dev

Eigenのコレスキー法を使用して大規模なスパース線形システムを解く

分類Dev

大規模なデータセット用のHMCのカスタム勾配関数の作成

Related 関連記事

  1. 1

    大規模なシステム管理

  2. 2

    多くのサードパーティの依存関係がある大規模なクロスプラットフォームC ++プロジェクトのディスク上の物理レイアウト

  3. 3

    大規模な操作でのC ++一時停止/再開システム

  4. 4

    大規模なMongoDBとの多対多の関係

  5. 5

    大規模なPython依存関係をS3に保存する方法(サーバーレスのAWS Lambdaの場合)

  6. 6

    大規模なシステムの設計をどのように始めますか?

  7. 7

    大規模なファイルシステムのバックアップをすばやく実行する

  8. 8

    Requirements.txtシステムに依存しないテンソルフローの依存関係を指定する方法

  9. 9

    WebSocketの同時テストの大規模なボリューム

  10. 10

    オプションのシステム依存関係により、「無効な推移的な依存関係(存在する場合)は使用できなくなります」

  11. 11

    システム間の依存関係のUML図

  12. 12

    Mavenへのシステム依存関係の追加

  13. 13

    C ++ STLのシステムレベルの依存関係

  14. 14

    Maven:複数のjarを指すシステム依存関係

  15. 15

    automakeビルドシステムの内部依存関係

  16. 16

    システム全体の依存関係グラフを生成する

  17. 17

    複雑な相互依存関係を持つMakefileと大規模プロジェクト

  18. 18

    大規模なタスクスケジューリングのためのスケーラブルなジョブキューシステム

  19. 19

    大規模なMakefileプロジェクトのすべての依存関係を収集するにはどうすればよいですか?

  20. 20

    Firestoreの大規模なコレクションとのレルム同期-アーキテクチャに関する質問/問題

  21. 21

    オペレーティングシステムに応じたJavaの依存関係?

  22. 22

    ライトスルーRAMディスク、またはファイルシステムの大規模なキャッシュ?

  23. 23

    大規模なJavaプロジェクトで非常に複雑なパッケージの依存関係を作成しないようにする技術的な理由はありますか?

  24. 24

    ホストシステムではなく、pbuilder環境内の依存関係を解決する

  25. 25

    ホストシステムではなく、pbuilder環境内の依存関係を解決する

  26. 26

    大規模なExcelスプレッドシートの作成

  27. 27

    LMDB:限られたメモリシステムで大規模なデータベースを開く

  28. 28

    Eigenのコレスキー法を使用して大規模なスパース線形システムを解く

  29. 29

    大規模なデータセット用のHMCのカスタム勾配関数の作成

ホットタグ

アーカイブ