私は npm を使っていますが、これは package.json ファイル内の依存関係を検索してダウンロードします。同様に、Java プロジェクトには pom.xml ファイルがあります。Maven はこのファイルを検索して依存関係をダウンロードしますか。依存関係 jar を提供するのではなく、package.json のようにこの pom.xml ファイルを渡すことはできますか。これらのツールは似ていて、異なるプラットフォーム用にビルドされているだけですか。
ベストアンサー1
同じツール、異なる言語?
Maven は、JS の NPM と同様に、Java のビルドおよび依存関係解決ツールとして最も人気があります。しかし、単に異なる言語用の同じツールというわけではありません。Java ビルドと JS ビルドには明らかに大きな違いがあり、これらの違いは Maven の動作に直接表れています。たとえば、多くの JS ツールは Git に依存して重い処理を行っていますが、Maven は Git より前から存在し、Git がこれまでうまく処理できなかったバイナリ成果物を処理する必要があり、カスタム ファイル システム ベースの Maven リポジトリで動作します。Maven ではソースとバイナリが明確に区別されていますが、JS の世界ではソースとバイナリは多くの場合同じものです。
Mavenの基礎
Maven の最も純粋な形式は宣言型モデルに従います。このモデルでは、pom.xml
( と同様package.json
) はビルドのさまざまなプロパティを定義しますが、スクリプトは含まれません。欠点は、プラグインに頼らなければならないため、スクリプトを使用せずにビルドのいくつかの側面を微調整することが難しい場合があることです。利点は、 を見るだけで他のビルドを理解しやすくなることです。pom.xml
通常、他のビルドはカスタマイズをあまり行わずに同じアプローチに従うためです。Gradle は、Maven の標準と規則に基づいて構築された人気の Groovy ベースのツールであり、pom.xml
この「スクリプトなし」の障壁を簡素化して打ち破るために特別に設計されています。
依存関係の参照
と同様にpackage.json
、依存関係を直接操作するのではなくpom.xml
、依存関係の座標を定義して、ビルド ツールに残りの処理を任せます。Maven では、これらの座標の基本形式は GAV (groupId、artifactId、version) です。
フラットな依存関係ツリー?
他の回答のコメントによると、MavenはNPMがデフォルトで提供する「ネストされた依存関係ツリー」ではなく、「フラットな依存関係ツリー」を提供します。Mavenは同じ依存関係の複数のバージョンを許可しません。異なるバージョンが要求された場合、Mavenは依存関係の解決単一のバージョンを選択することです。つまり、推移的な依存関係が必要なバージョンと異なるバージョンを取得することもありますが、これを管理する方法はあります。ただし、この制限は Maven ではなく Java によるもので、(通常) Java ではクラスローダーはクラスパスに複数の定義が見つかった場合でも単一のクラス定義へのアクセスしか提供しません。Java はこれを特にうまく処理できないため、Maven は最初からこのシナリオを回避しようとします。
注: npm v3以降、依存関係はフラット化されています。代替パッケージマネージャー糸も同様です。
成熟
さらに、MavenはNPMよりもかなり古く、ユーザーベースが大きく、カスタムプラグインの数も膨大で、これまでのところ全体的に成熟していると言えるでしょう。Mavenは、他の言語やAndroidなどの特定の環境を扱うためのプラグインがあるため、Java以外のプロジェクトや多言語プロジェクトにも使用されることがあります。Mavenと他のビルドツールを橋渡しするプラグインもあります。フロントエンド Maven プラグイン実際に複数の JS ビルド ツールを処理します。