web-dev-qa-db-ja.com

Mavenはnpmに似ていますか?

Package.jsonファイルで依存関係を探し、それをダウンロードするnpmで作業したので。同様に、Javaプロジェクトにpom.xmlファイルがあります。 Mavenはこのファイルを検索し、依存関係をダウンロードしますか。依存関係jarを与えるのではなく、package.jsonのようなこのpom.xmlファイルを渡すことはできますか?これらのツールは似ており、異なるプラットフォーム用に構築されていますか?

57
Shubham Jain

同じツール、異なる言語?

Mavenは、NPMがJS用であるのと同様に、Java用の最も一般的なビルドおよび依存関係解決ツールです。しかし、異なる言語用の同じツールではありません。 JavaビルドとJSビルドには明らかに大きな違いがあり、これらの違いはMavenの動作方法で直接目に見えます。たとえば、多くのJSツールはGitを使用していくつかの手間のかかる作業を行いますが、MavenはGitより前のカスタムファイルシステムベースのMavenリポジトリで動作し、Gitは歴史的にうまく処理できなかったバイナリアーティファクトを処理する必要があります。 Mavenでは、ソースとバイナリの間に明確な分離がありますが、JSの世界では多くの場合同じです。

Mavenの基本

最も純粋な形式のMavenは、pom.xmlpackage.jsonに類似)がビルドのさまざまなプロパティを定義する宣言モデルに従いますが、スクリプトは含まれません。欠点は、プラグインに依存する必要があるため、スクリプトを使用せずにビルドの一部を微調整するのが難しい場合があることです。利点は、pom.xmlを見るだけで他のビルドを理解しやすくなることです。これらのビルドは通常、あまり多くのカスタマイズなしで同じアプローチに従うためです。 Gradleは、Mavenの標準と規則に基づいて構築された人気のあるGroovyベースのツールであり、pom.xmlを簡素化し、この「スクリプトなし」の壁を破るように特別に設計されています。

依存関係の参照

package.jsonと同様に、依存関係のpom.xmlを直接操作するのではなく、依存関係の座標を定義して、ビルドツールに残りを処理させます。 Mavenでは、これらの座標の基本的な形式はGAV(groupId、artifactId、version)です。

フラットな依存関係ツリー?

他の回答のコメントに基づいて、MavenはNPMがデフォルトで提供する「ネストされた依存関係ツリー」ではなく、「フラットな依存関係ツリー」を提供します。 Mavenは、同じ依存関係の複数のバージョンを許可しません。異なるバージョンが要求された場合、Mavenは dependency resolution を使用して単一のバージョンを選択します。これは、推移的な依存関係が必要とするバージョンと異なるバージョンを取得する場合があることを意味しますが、これを管理する方法があります。ただし、この制限はMavenではなくJavaによるものです。Javaでは、クラスローダーはクラスパス上に複数の定義が見つかった場合でも単一のクラス定義へのアクセスのみを提供するためです。 Javaはこれを扱うのが特に苦手なので、Mavenはそもそもこのシナリオを避けようとします。

注:npm v3以降、依存関係はフラット化されています。代替パッケージマネージャー yarn も同じことを行います。

成熟

さらに、MavenはNPMよりもかなり古く、ユーザーベースが大きく、カスタムプラグインの数が膨大であり、これまでのところ、全体としてはより成熟していると考えられます。 Mavenは、Android以外の言語や特定の環境を処理するためのプラグインがあるため、Java以外のプロジェクトやポリグロットプロジェクトにも使用されることがあります。実際には複数のJSビルドツールを処理する frontend-maven-plugin など、Mavenと他のビルドツールをつなぐプラグインがあります。

95
Anton Koscejev

はい。 Java用の同様のパッケージ化ツールです。 gradleも探してください。これはgroovy languageでより自由になりますが、最初はmavenを使用して依存関係を整理できます。タグとしてタグを含めると、mavenが自動的に処理します。

依存関係ツリーを走査し、適切なすべてのjarをダウンロードします。

3
Apostolos

はい、gradleと同じですが、npmほどユーザーフレンドリーではありません。

0
LEMUEL ADANE