私はpackage.jsonファイルで依存関係を探してダウンロードするnpmを使用してきました。同様に、Javaプロジェクトにpom.xmlファイルがあります。Mavenはこのファイルを調べて、依存関係をダウンロードしますか?依存関係のjarを指定するのではなく、package.jsonのようなこのpom.xmlファイルを渡すことはできますか?これらのツールは類似しており、異なるプラットフォーム用に構築されていますか?
私はpackage.jsonファイルで依存関係を探してダウンロードするnpmを使用してきました。同様に、Javaプロジェクトにpom.xmlファイルがあります。Mavenはこのファイルを調べて、依存関係をダウンロードしますか?依存関係のjarを指定するのではなく、package.jsonのようなこのpom.xmlファイルを渡すことはできますか?これらのツールは類似しており、異なるプラットフォーム用に構築されていますか?
回答:
Mavenは、NPMがJS用であるのと同様に、Java用の最も人気のあるビルドおよび依存関係解決ツールです。しかし、それは異なる言語のための同じツールだけではありません。JavaビルドとJSビルドの間には明らかに大きな違いがあり、これらの違いはMavenの動作方法に直接表れています。たとえば、多くのJSツールはGitに依存して手間のかかる作業を行っていますが、MavenはGitよりも前から存在し、Gitがこれまでうまく処理できなかったバイナリアーティファクトを処理する必要があるため、カスタムファイルシステムベースのMavenリポジトリで動作します。Mavenでは、ソースとバイナリが明確に分離されていますが、JSの世界では同じものであることがよくあります。
最も純粋な形式の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よりもかなり古く、ユーザーベースが大きく、カスタムプラグインの数が非常に多いため、これまでのところ、全体としてより成熟していると見なすことができます。他の言語やAndroidなどの特定の環境を処理するためのプラグインがあるため、MavenはJava以外のプロジェクトや多言語プロジェクトにも使用されることがあります。Mavenと、実際に複数のJSビルドツールを処理するfrontend-maven-pluginなどの他のビルドツールをブリッジするプラグインがあります。
以下では|
、Mavenを分離するために使用します| それぞれnpm用語:
どちらのツールも、記述子ファイルに基づく依存関係(アーティファクト|パッケージ)の動的フェッチをサポートしていますpom.xml
。package.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ではそれが必要とするコードを記述するか、設定する補完的なビルドツールのようなgulp
、webpack
など
何らかの理由で、npmモジュールでユーザーが定義したバージョン範囲は、Mavenよりもはるかに緩いです。これにより、推移的な依存関係で問題が発生する可能性があります。そのため、最近追加のファイルが追加されました。package-lock.json
npmを使用すると、新しいプロジェクトを開始する方がはるかに簡単ですnpm init
。Mavenを使用する場合は、最小限の記述方法pom.xml
、またはアーキタイプについて読む方法を知る必要があります。
一般に、編集するのpom.xml
はpackage.json
。よりもはるかに一般的です。たとえば、mavenでの依存関係の追加は、コマンドラインを介してnpmで手動で(またはIDEを介して)行われます。
すべてのビルドツールと同様に、一方のツールをもう一方の内部から呼び出すことができますが、反対よりも、mavenの内部からnpmを呼び出す方がはるかに一般的だと思います。
npmはdev、productionビルドをサポートしています。Mavenでは、これはプロファイルを介して定義する必要があります。
はい。これは、Java用の同様のパッケージツールです。でgradle
より自由になるものも探してください。groovy language
ただし、最初はmaven
依存関係を整理するために使用できます。そこにタグとしてそれらを含めると、Mavenがあなたに代わって仕事をします。
依存関係ツリーをトラバースし、適切なすべてのjarをダウンロードします。
gradle
あるmaven + ant
のは、言わせて一緒に。Mavenが行うことを実行しますが、実行するすべての事実上のジョブとは別に、コードやスクリプトを自由に作成することもできます。私はgulp
ちょうど今見ました。多分それは私が読んだものから、同じです。Maven vs Gradleの使用を開始したい場合maven
は、どちらから始めて、より明確で理解しやすくしてから、混乱させることをお勧めしgradle
ます。
はい、gradleと同じですが、npmほどユーザーフレンドリーではありません。