Mavenはnpmに似ていますか?


84

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


回答:


124

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

Mavenは、NPMがJS用であるのと同様に、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.jsonpom.xml依存関係を直接操作するのではなく、依存関係の座標を定義し、ビルドツールに残りを処理させます。Mavenでは、これらの座標の基本的な形式はGAV(groupId、artifactId、version)です。

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

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

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

成熟

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


4
上記の情報に加えて、次のYoutubeプレイリストは、パッケージマネージャーとしてのMavenの使用を説明する素晴らしい仕事をしています
Tommy Thompson

1
私はよくnpmjs.comにアクセスして、役立つパッケージを検索します。Maven(search.maven.org)でこれを行うためのリンクを見つけるには、かなりのグーグルが必要でした。ただし、検索でドキュメントが表示されたり、人気の指標が表示されたり、githubが表示されたりすることはありません。これは人々がNPMに期待しているが、Mavenには期待していないことを示唆しているので、役に立たないと思います。
ジョーラップ2017年

NPMとMavenのかなり良い統計比較はここにあります:stackshare.io/stackups/npm-vs-gradle
cacoder

1
この回答の更新:「さらに、MavenはNPMよりもかなり古く、ユーザーベースが大きい...」これは、質問が2017年に最初に回答されたときにおそらく当てはまりましたが、正確ではなくなりました。@cacoderによって投稿されたリンクによると、NPMのユーザーベースは現在、Mavenのユーザーベースの約11倍になっています。出典:stackshare.io/stackups/gradle-vs-maven-vs-npm
mnutsch

28

以下では|、Mavenを分離するために使用します| それぞれnpm用語:

共通の機能:

  • どちらのツールも、記述子ファイルに基づく依存関係アーティファクト|パッケージ)の動的フェッチをサポートしていますpom.xmlpackage.json、および展開することもできます| 独自のアーティファクトを公開する| パッケージ

  • どちらにもデフォルトのパブリックリポジトリがあります| レジストリhttp://repo.maven.apache.org/maven2/ | https://registry.npmjs.org)ですが、サードパーティも使用できます(settings.xml|.npmrc経由)。

  • どちらもビルドレベルの依存関係の概念をサポートしています(プラグイン|スクリプトで使用されるdevDependencies)。* Mavenはprovided依存関係もサポートしていますが、javascriptがコンテナーにデプロイされることはめったにないため、これはnpmには当てはまらないようです。

  • 彼らは支援の依存名前空間の両方:groupId|scope

相違点:

  • Mavenには追加のローカルリポジトリ(キャッシュ)があります:

    • 異なるプロジェクトに対して同じ依存関係を再度フェッチする必要はありません。
    • ローカルにインストールされたアーティファクトは、他のローカルプロジェクトから自動的にアクセスできます。
  • Mavenでビルドされたプロジェクトからの依存関係はにダウンロードされ<homedir>/.m2ます。npmを使用すると、でダウンロードされ<projectdir>/node_modulesます。

  • Mavenでのビルドは、通常、1ステップのプロセスです:(mvn packageフェッチ深度、ビルド)。npmでは、2ステップのプロセスです:(npm installフェッチデップ)、npm build(ビルド)

  • Mavenの定義は、ライフサイクルを構築(導入、テスト、構築するための)デフォルトの操作は(ゴールをプラグイン)先の、段階から成って取り付けdifferrentパッケージオプション(に基づいて、.jar.war.earなど)。次に、これらの操作を上書きするか、(プラグインシステムを介して)新しい操作を挿入できます。これにより、ビルド、ドキュメント、テスト、デプロイなどのすぐに使用できるソリューションが提供されます。npm
    アプローチはより単純です(スクリプトを参照 )。

  • 上記の理由により、npmはjavascriptのパッケージ管理ツールとしてラベル付けされ、mavenはjavaのビルド自動化および依存関係管理ツールとしてラベル付けされます。

  • Mavenのセットアップでは、ビルドプロセスにはpom.xmlより一般的にはの編集が含まれます
    NPMではそれが必要とするコードを記述するか、設定する補完的なビルドツールのようなgulpwebpackなど

  • 何らかの理由で、npmモジュールでユーザー定義したバージョン範囲は、Mavenよりもはるかに緩いです。これにより、推移的な依存関係で問題が発生する可能性があります。そのため、最近追加のファイルが追加されました。package-lock.json

  • npmを使用すると、新しいプロジェクトを開始する方がはるかに簡単ですnpm init。Mavenを使用する場合は、最小限の記述方法pom.xml、またはアーキタイプについて読む方法を知る必要があります。

  • 一般に、編集するのpom.xmlpackage.json。よりもはるかに一般的です。たとえば、mavenでの依存関係の追加、コマンドラインを介しnpmで手動で(またはIDEを介して)行われます。

  • すべてのビルドツールと同様に、一方のツールをもう一方の内部から呼び出すことができますが、反対よりも、mavenの内部からnpmを呼び出す方がはるかに一般的だと思います。

  • npmはdev、productionビルドをサポートしています。Mavenでは、これはプロファイルを介して定義する必要があります


5

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

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


1
私はこれらすべてのjsツールにあまり精通していないのでわかりません。gradleあるmaven + antのは、言わせて一緒に。Mavenが行うことを実行しますが、実行するすべての事実上のジョブとは別に、コードやスクリプトを自由に作成することもできます。私はgulpちょうど今見ました。多分それは私が読んだものから、同じです。Maven vs Gradleの使用を開始したい場合mavenは、どちらから始めて、より明確で理解しやすくしてから、混乱させることをお勧めしgradleます。
アポストロス2016

ありがとう。Mavenにはフラットな依存関係ツリーまたはネストされた依存関係ツリーがありますか?
Shubham Jain 2016

1
たとえば、ここを参照してくださいmvnrepository.com/artifact/org.hibernate/hibernate-core/…。hibernateは他のさまざまなライブラリに依存していますが、これらのjarは、hibernateライブラリ内のローカルmavenリポジトリには保存されず、独自のパッケージに保存されます。
アポストロス2016

1
ネストされた(推移的な)依存関係の処理には違いがあると思います。すべてのノードモジュールに独自のバージョンの依存関係を含めることができますが、複数の依存関係で同じ3番目の依存関係が必要であるがバージョンが異なる場合、Mavenは単一の共通の依存関係に解決しようとします。また、タスクベースなので、gruntはgradleと一致すると思います。gradleはant + ivyであり、mavenはコンベンション主導型です。おそらくwebpackに近いですが、あまり似ているものはありません。
wemu 2016

1
すみません、あなたは正しいです。私が時々使用してバージョンを定義するプロファイル構築手順と混同しました。
アポストロス2016

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.