なぜメイベン?メリットは何ですか?[閉まっている]


131

antと言った場合と比較して、mavenを使用する主な利点は何ですか?便利なツールというよりは迷惑なようです。私はMaven 2とプレーンEclipse Java EE(m2eclipseなし)、およびtomcatを使用します。

mavenの支持者は、

  1. Mavenを使用すると、パッケージの依存関係を簡単に取得できます

  2. Mavenはあなたに標準のディレクトリ構造を強制します

私の経験では

  1. パッケージの依存関係を把握することはそれほど難しくありません。とにかくめったにそれをしません。おそらく、プロジェクトのセットアップ中に1回、アップグレード中に数回です。mavenを使用すると、依存関係の不一致、pomの記述が不適切、そしてパッケージの除外を実行することになります。

  2. FIX-COMPILE-DEPLOY-DEBUGサイクルが遅く、生産性が低下します。これが私の主な不満です。変更を加えたら、Mavenビルドが開始されるのを待ち、それがデプロイされるのを待つ必要があります。ホットデプロイメントはまったくありません。

それとも私はそれを間違っていますか?私を正しい方向に向けてください、私はすべて耳です。


1
私はポイント2に本当に興味があります。修正、コンパイル、展開のサイクルが遅いことに他の誰かが気付いていますか?または、誰もが知っていますが、Mavenは私たちが持っている最高の/最も一般的な/最もクールなものなので、それについて静かに保ちます。展開するwar / earを作成することは十分に悪いことであり、Mavenはそれをさらに悪化させています。展開されたディレクトリ構造で、Mavenプロジェクトのjsp変更を表示するには、私のマシンで約5秒かかりますか?1秒未満。私は複数回保存でき、mavenで最新の変更のみをコンパイルしますか?保存するたびにビルドがトリガーされます。
Trix

多分それはここでは問題ではありませんが、IDEサポート/プラグインですか?しかし、mavenはかなり長い間存在していました。正しく理解できない場合は、他の何かを移動/発明/提案する必要がありますか?アイビーのほか
trix

2
@Javid質問のタイトルは似ていますが、質問の本文は別のIMOであり、私はそれを重複とは見なしません。
Pascal Thivent、2010


一瞬

回答:


108

パッケージの依存関係を把握することはそれほど難しくありません。とにかくめったにそれをしません。おそらく、プロジェクトのセットアップ中に1回、アップグレード中に数回です。mavenを使用すると、依存関係の不一致、pomの記述が不適切、そしてパッケージの除外を実行することになります。

それほど難しいことではありません...おもちゃのプロジェクトでは。しかし、私が取り組んでいるプロジェクトには多くの、本当に多くのプロジェクトがあり、それらを推移的に取得して、それらの標準化された命名体系を作成できてとても嬉しく思います。これらすべてを手動で手動で管理することは悪夢です。

そして、はい、依存関係の収束に取り組む必要がある場合があります。しかし、これを2回考えてみてください。これはMavenに固有のものではなく、依存関係を使用するすべてのシステムに固有のものです(ここでは、Javaの依存関係一般について説明しています)。

Ant を使用する場合は、すべてを手動で行う必要があることを除いて、同じ作業を行う必要があります。プロジェクトAのバージョンとその依存関係を取得し、プロジェクトBのバージョンとその依存関係を取得し、使用する正確なバージョンを確認し、確認します。重複しないこと、互換性がないことの確認など。地獄へようこそ。

一方、Mavenは依存関係管理をサポートし、それらを一時的に取得して、依存関係管理に固有の複雑さを管理するために必要なツールを提供します。依存関係ツリーを分析し、推移的な依存関係で使用されるバージョンを制御し、一部を除外できますそれらは場合に必要な、魔法はありませんなど、モジュール間で収束を制御します。しかし、少なくともあなたはサポートしています。

そして、依存関係の管理はMavenが提供する機能のごく一部であり、はるかに多くの機能があることを忘れないでください(Mavenとうまく統合する他のツール、たとえばSonarについてさえ言及していません)。

FIX-COMPILE-DEPLOY-DEBUGサイクルが遅く、生産性が低下します。これが私の主な不満です。変更を加えたら、Mavenビルドが開始されるのを待ち、それがデプロイされるのを待つ必要があります。ホットデプロイメントはまったくありません。

まず、なぜこのようにMavenを使用するのですか?私はしません。私はIDEを使用して、テスト、コードがパスするまでコードを記述し、リファクタリング、デプロイ、ホットデプロイし、完了前にローカルMavenビルドを実行してからコミットする前に、継続的なビルドを中断しないようにします。

第二に、Antを使用することで状況が大幅に改善されるかどうかはわかりません。そして、私の経験では、バイナリ依存関係を使用したモジュラーMavenビルドは、典型的なモノリシックAntビルドよりもビルド時間を短縮します。とにかく、Maven Shellを見て、Maven環境を(再)使用する準備ができていることを確認してください(ちなみに、これは素晴らしいです)。

結局のところ、申し訳ありませんが、生産性を低下させているのは実際にはMavenではなく、ツールの誤用です。そして、あなたがそれに満足していないなら、まあ、私が言うことができる、それを使用しないでください。個人的には、2003年からMavenを使用しており、振り返ることはありません。


@Pascal、使用しているツールを教えてください。IDE、プラグインなど。.propertiesファイルまたはjspファイルを変更すると、これはMavenビルドを行わずにホットデプロイされることを教えてくれますか?(ホットデプロイはここでは正しい用語ではない可能性があります)。私はアリで何を意味するのかよくわかりませんでした。開発中に標準の展開ディレクトリを使用し、リリース前にantを使用してwar / earを作成することを意味しました。展開されたディレクトリの場合、ルールは単純で、ファイルをsrcからクラスにコピー/コンパイルし、残りは変更しません。
Trix

続き...しかし、私のプロジェクトでは、tomcatにデプロイされているのはモジュールのjarです。.jspを変更した場合、mavenはそれらのjarを再構築する必要はありませんか?
Trix

4
あなたは認めなければなりません、ほとんどのプロジェクトはおもちゃのプロジェクト、別名単純な依存関係です。それは単なる統計の法則です。
Trix

2
@trix、ホットデプロイメントantとmavenについて:ホットデプロイメント用にantビルドを行わない場合、なぜ同じためにMavenを使用するのですか?antを同じに使用すると、少なくとも同じ時間がかかると思います...
レディ

2
Pascal、プロジェクトをどのようにMaven Natureに構成し、ビルドプロセスを使用してデプロイしないのか教えてください。これが最初の質問のポイント2です。どうすればいいのか迷っていますので、わかりやすく説明していただければ幸いです。

20

Mavenは、Antのようなビルドツールだけでなく、完全なプロジェクト開発ツールと見なすことができます。すべての問題を解決するには、mavenプラグイン備えたEclipse IDEを使用する必要があります。

Mavenページを使用する利点から引用した、Mavenのいくつかの利点を次に示します。

ヘニング

  • クイックプロジェクトセットアップ、複雑なbuild.xmlファイルは不要、POMのみで実行
  • 一元化されたPOMにより、プロジェクトのすべての開発者は同じjar依存関係を使用します。
  • 「無料」でプロジェクトの多数のレポートとメトリックを取得する
  • jarは中央の場所からプルできるため、ソース配布のサイズを削減します

エマニュエル・ヴェニス

  • 多くの目標が利用可能であるため、ANTとは逆に特定のビルドプロセス部分を開発する必要はありません。既存のANTタスクをantrunプラグインを使用してビルドプロセスで再利用できます。

ジェシー・マコネル

  • コードのモジュール設計を促進します。複数のプロジェクトを簡単に管理できるようにすることで、デザインを複数の論理パーツにレイアウトし、pomファイルの依存関係追跡を使用してこれらのパーツを織り交ぜることができます。
  • コードのモジュール設計を実施します。モジュラーコードにlipserviceを支払うのは簡単ですが、コードが別個のコンパイルプロジェクトにある場合、依存関係管理で特に許可しない限り、コードのモジュール間で参照を相互受粉することはできません...これを今すぐ行って、後で修正するだけです。
  • 依存関係管理は明確に宣言されています。依存関係管理メカニズムでは、jarのバージョン管理を台無しにしようとする必要があります...「このベンダーのjarのどのバージョンがこれなのか」という古典的な問題はありません。そして、既存のプロジェクトにそれを設定すると、リポジトリに「不明な」バージョンを作成して実行するように強いられたときに存在する場合、既存の混乱からトップが取り除かれます... ABC.jarの実際のバージョン。
  • 強力な型付きライフサイクルソフトウェアシステムは、ビルドの開始から終了までの強力に定義されたライフサイクルがあり、ユーザーは自分のライフサイクルをまとめるのではなく、システムを混合してライフサイクルに一致させることができます。これには、人々が1つのプロジェクトから別のプロジェクトに移動し、ソフトウェア構築に関して同じ語彙を使用して話すことができるという追加の利点があります

ヴィンセント・マッソル

  • より大きな勢い:Antは現在レガシーであり、急速に前進していません。Mavenは急速に前進しており、Mavenの周りに多くの高価値ツール(CI、ダッシュボードプロジェクト、IDE統合など)が存在する可能性があります。

5
反対投票の場合は理由を説明してください。これは明言されていませんが、スタックオーバーフローに関する倫理規則です。
YoK

1
参照に問題はありませんが、コンテンツが自分のものではないことを明確にする必要があります。
Pascal Thivent、2010

ありがとう。どこから参照されたかを言及するだけでなく、引用することを確認します。stackoverflowでちょうど30奇妙な日であり、まだ芸術を学びます:)。
YoK

11

小さなプロジェクトの依存関係を把握することは難しくありません。しかし、何百もの依存関係を持つ依存関係ツリーの処理を開始すると、物事は簡単に手に負えなくなります。(私はここでの経験から話しています...)

もう1つのポイントは、インクリメンタルコンパイルとMavenサポート(Eclipse + m2eclipseなど)を備えたIDEを使用する場合、編集/コンパイル/ホットデプロイとテストを設定できることです。

私は個人的にこれをしません。なぜなら、過去の悪い経験(Maven以前)のためにこの開発モードを信用しないようになったからです。おそらく誰かがこれが実際にEclipse + m2eclipseで動作するかどうかについてコメントすることができます。


mavenを使用してすべての依存関係を取得してから、依存関係を自分のプロジェクトにコピーすることができますか?
trix

2
できると思います。ただし、プロジェクトの依存関係を更新した場合や、プロジェクトがスナップショットに依存している場合は、問題が発生する可能性があります。
スティーブンC

つまり、2つのプロジェクトがあるということです。Mavenプロジェクトの唯一の目的は、依存関係を取得することです。バージョン管理を使用して、依存関係の更新間の変更を追跡します。とにかくこれを行うのは、ビルドが壊れた場合に備えて、変更を確認できるようにするためです。
trix

4
ああ。それはMavenが使用されるように設計されている方法ではありません。Mavenの大きな利点の1つは、依存ライブラリをバージョン管理にチェックインしないようにすることです。あなたのアプローチでは、たくさんのバイナリファイルのたくさんのバージョンであなたのVCSを乱雑にするでしょう。また、一部のVCSはバイナリファイルの処理が特に得意ではありません。
スティーブンC

2
一般的に、あなたがプログラムを書くとき、魔法のあらゆる種類の非常に疲れたように、ハードな方法を学ぶ:-S
するThorbjörnRavnアンデルセン

9

Mavenは、学習にかなりの時間を費やすため、実際に気に入って使用したいということを実際に事前決定する必要があるツールの1つです。(あなたそれを好きでそれを使いたいので)学習中に疑いの余地があります!

強力な慣例は、Mavenプロジェクトで不思議なことができるHudsonのような多くの場所で役立ちますが、最初はわかりにくいかもしれません。

編集:2016年現在、Mavenは、3つの主要なIDEすべてがそのままソースを使用できる唯一のJavaビルドツールです。つまり、mavenを使用すると、ビルドがIDEに依存しなくなります。これにより、たとえば日食で通常作業している場合でもNetbeansプロファイリングを使用できます


1
そして、逆に、それはなど、アリではないので、多くの人が、先入観憎しみとのmavenに来るのも事実である
ゴヴニュ

反対?もしかして?
–ThorbjørnRavn Andersen-2010

9

Antに対するMavenの利点はかなりの数です。ここでまとめてみます。

構成に関する規約
Mavenは、プロジェクトのレイアウトと起動に独特のアプローチを使用しているため、プロジェクトに簡単にジャンプできます。通常、プロジェクトのアーティファクトを取得するには、checkountとmavenコマンドのみが必要です。

プロジェクトのモジュール化
プロジェクトの規則は、開発者にプロジェクトをモジュール化することを推奨します(または、強制することが望ましい)。モノリシックプロジェクトの代わりに、プロジェクトを小さなサブコンポーネントに分割することを強いられることがよくあります。これにより、プロジェクト構造全体のデバッグと管理が容易になります。

依存関係管理とプロジェクトライフサイクル
全体として、適切なSCM構成と内部リポジトリがあれば、依存関係管理は非常に簡単で、プロジェクトライフサイクル(コンポーネントのバージョン、リリース管理など)の観点から考える必要があります。アリよりも少し複雑ですが、プロジェクトの品質が向上しています。

mavenの何が問題になっていますか?
Mavenは簡単ではありません。ビルドサイクル(何がいつ行われるか)は、POM内ではそれほど明確ではありません。また、コンポーネントの品質や、パブリックリポジトリの依存関係の欠如に関連して、いくつかの問題が発生します。
(私にとって)最良のアプローチは、依存関係をキャッシュ(および保持)するための内部リポジトリーを用意し、コンポーネントのリリース管理に適用することです。本のサンプルプロジェクトよりも大きいプロジェクトの場合は、前または後のmavenに感謝します


6

Mavenは、標準の規則とプラクティスを使用して開発サイクルを加速すると同時に、より高い成功率を達成するのに役立つことで、ビルドプロセスにメリットをもたらすことができます。Mavenが開発プロセスを支援する方法の詳細については、「Mavenを使用する利点」を参照してください。


3

Mavenは、POM(プロジェクトオブジェクトモデル)に基づく強力なプロジェクト管理ツールです。プロジェクトのビルド、依存関係、ドキュメントに使用されます。それはANTのようなビルドプロセスを簡素化します。ただし、ANTよりも高度です。Mavenは、ビルド、ドキュメント、レポリング、SCM、リリース、配布の管理に役立ちます。-mavenリポジトリは、pom.xmlファイルを含むパッケージ化されたJARファイルのディレクトリです。Mavenはリポジトリーで依存関係を検索します。


2

ポイント2に遭遇したことはありませんか?これが展開に何らかの影響を与えると考える理由を説明してください。Mavenを使用すると、特定の層のバグのホットフィックスを実際に許可し、プロジェクトの残りの部分からAPIを独立して開発できるように、モジュール化された方法でプロジェクトを構造化できます。

すべてを単一のモジュールに詰め込もうとしている可能性があります。その場合、問題はまったく問題ではなく、使用方法です。


私は単純な日食ジー、maven 2、tomcatを使用しています。明らかにウェブアプリです。プロパティファイルまたはjspを変更する場合、tomcatでの変更を確認するには、mavenがビルドを行い、war / earを作成して、tomcatにデプロイする必要があります。これは、展開されたディレクトリ構造を使用する場合に比べて時間がかかります。
trix

1
Tomcatを使用したEclipseでの@trixホットデプロイが機能する。あなたはそれを間違っています。
Pascal Thivent、2010

0

これはコメントであるべきでしたが、コメントの長さに収まらないので、回答として投稿しました。

他の回答で言及されているすべての利点は、Mavenを使用するよりも簡単な方法で実現できます。たとえば、プロジェクトが初めての場合でも、jarをダウンロードしてlibフォルダーにコピーするよりも、プロジェクトアーキテクチャの作成、コンポーネントの結合、コーディングに多くの時間を費やすことになります。ドメインの経験がある場合は、どのライブラリを使用してプロジェクトを開始するかを既に知っています。Mavenを使用するメリットはないと思います。特に、「依存関係の管理」を自動的に実行しているときに多くの問題が発生する場合はそうです。

私はmavenの中間レベルの知識しか持っていませんが、mavenを使用せずに(ERPのような)大規模なプロジェクトを実行しました。

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