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フェッチャーに委任するようです。
ここにはもっと大きな問題があります。これは、Windowsでは「DLL地獄」と呼ばれていたものです。場合によっては、2つの直接的な第1レベルの依存関係が、同じ推移的な依存関係の異なるバージョン(log4j.jarなど)を指すことがあります。クラスパスに含めることができるlog4j.jarは1つだけであるため、依存関係の解決には、システム内のすべてのクライアントと互換性のあるバージョンを手動で決定することが含まれます。
結局のところ、各パッケージの依存関係仕様(POM)の品質に帰着すると思います。ActiveMQの場合、スコープ宣言がないため、ActiveMQへの参照は、不要であることがわかっている依存関係を手動で除外しない限り、すべての依存関係をダウンロードします。
log4jの場合、自動依存関係解決では、log4jのすべてのクライアント(log4jに依存する他のパッケージ)がlog4jの以前のすべてのバージョンに対して検証し、POMに互換性のあるlog4jバージョンの範囲(またはリスト)を提供する必要があります。それは多分質問するには多すぎます。
これは現在の状況ですか、それとも何かが足りないのですか?