AntとMavenの違い [closed] 質問する

AntとMavenの違い [closed] 質問する

Ant と Maven の違いを教えていただけますか? どちらも使用したことはありません。Java プロジェクトのビルドを自動化するために使用されることは理解していますが、どこから始めればよいかわかりません。

ベストアンサー1

Maven: 決定版ガイド、導入部でMavenとAntの違いについて書きました。セクションのタイトルは「Ant と Maven の違い」ここでは、その紹介の情報といくつかの追加メモを組み合わせた回答を示します。

簡単な比較

これは、最も基本的なレベルでは、Maven には組み込みの規則があるという考え方を説明するためだけに示しています。以下は、単純な Ant ビルド ファイルです。

<project name="my-project" default="dist" basedir=".">
    <description>
        simple example build file
    </description>   
    <!-- set global properties for this build -->   
    <property name="src" location="src/main/java"/>
    <property name="build" location="target/classes"/>
    <property name="dist"  location="target"/>

    <target name="init">
      <!-- Create the time stamp -->
      <tstamp/>
      <!-- Create the build directory structure used by compile -->
      <mkdir dir="${build}"/>   
    </target>

    <target name="compile" depends="init"
        description="compile the source " >
      <!-- Compile the java code from ${src} into ${build} -->
      <javac srcdir="${src}" destdir="${build}"/>  
    </target>

    <target name="dist" depends="compile"
        description="generate the distribution" >
      <!-- Create the distribution directory -->
      <mkdir dir="${dist}/lib"/>

      <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file
-->
      <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
   </target>

   <target name="clean"
        description="clean up" >
     <!-- Delete the ${build} and ${dist} directory trees -->
     <delete dir="${build}"/>
     <delete dir="${dist}"/>
   </target>
 </project>

この簡単な Ant の例では、Ant に正確に何をすべきかを伝える必要があることがわかります。compile ゴールには、src/main/java ディレクトリのソースを target/classes ディレクトリにコンパイルする javac タスクが含まれています。ソースがどこにあるか、結果のバイトコードを保存する場所、これらすべてを JAR ファイルにパッケージ化する方法などを Ant に正確に伝える必要があります。最近の開発により Ant の手続き性は低下していますが、開発者が Ant を使用するのは、XML で記述された手続き型言語をコーディングすることになります。

前の Ant の例と Maven の例を比較してみましょう。Maven では、Java ソースから JAR ファイルを作成するには、単純な pom.xml を作成し、ソース コードを ${basedir}/src/main/java に配置して、コマンド ラインから mvn install を実行するだけです。同じ結果を実現する Maven pom.xml の例です。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sonatype.mavenbook</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0</version>
</project>

pom.xml に必要なのはこれだけです。コマンド ラインから mvn install を実行すると、リソースが処理され、ソースがコンパイルされ、単体テストが実行され、JAR が作成され、他のプロジェクトで再利用できるように JAR がローカル リポジトリにインストールされます。変更せずに mvn site を実行すると、target/site に index.html ファイルが作成され、JavaDoc へのリンクとソース コードに関するいくつかのレポートが含まれています。

確かに、これは最も単純なサンプル プロジェクトです。ソース コードのみが含まれ、JAR を生成するプロジェクトです。Maven の規則に従い、依存関係やカスタマイズを必要としないプロジェクトです。動作をカスタマイズし始めると、pom.xml のサイズが大きくなり、最大のプロジェクトでは、プラグインのカスタマイズや依存関係の宣言が大量に含まれた非常に複雑な Maven POM のコレクションが表示されます。ただし、プロジェクトの POM ファイルがさらに充実しても、Ant を使用した同様のサイズのプロジェクトのビルド ファイルとはまったく異なる種類の情報が保持されます。Maven POM には、「これは JAR プロジェクトです」や「ソース コードは src/main/java にあります」などの宣言が含まれます。 Ant ビルド ファイルには、「これはプロジェクトです」、「ソースは にありますsrc/main/java」、「javacこのディレクトリに対して実行します」、「結果を に入れますtarget/classses」、「... から JAR を作成します」などの明示的な指示が含まれています。Ant ではプロセスについて明示的に指定する必要がありましたが、Maven にはソース コードがどこにあり、どのように処理する必要があるかを知っている「組み込み」機能がありました。

高レベルの比較

この例における Ant と Maven の違いは何でしょうか? Ant...

  • 共通のプロジェクト ディレクトリ構造のような正式な規則がないため、ソースがどこにあるか、出力がどこに置かれるかを Ant に正確に伝える必要があります。非公式の規則は時間の経過とともに出現しましたが、製品に体系化されていません。
  • 手続き型なので、Ant に何をいつ実行するかを正確に指示する必要があります。コンパイル、コピー、圧縮の順に指示する必要がありました。
  • ライフサイクルがないため、目標と目標の依存関係を定義する必要がありました。各目標に一連のタスクを手動で添付する必要がありました。

Maven はどこに...

  • 規則があり、規則に従っているためソースコードがどこにあるかがすでにわかっていました。バイトコードは target/classes に配置され、target に JAR ファイルが生成されました。
  • 宣言型です。pom.xml ファイルを作成し、ソースをデフォルトのディレクトリに置くだけで済みます。残りは Maven が処理します。
  • にはライフサイクルがあり、 を実行したときに呼び出されますmvn install。このコマンドは、ライフサイクルに到達するまで一連のシーケンス ステップを実行するように Maven に指示します。ライフサイクルを経るこの過程の副作用として、Maven はコンパイルや JAR の作成などの処理を実行するいくつかのデフォルトのプラグイン ゴールを実行しました。

アイビーはどうですか?

そうですね、Steve Loughran のような人がこの比較を読んで不正を指摘するでしょう。彼は、この回答が Ivy と呼ばれるものや、Ant の最近のリリースで Ant がビルド ロジックを再利用できるという事実を完全に無視していることについて話すでしょう。これは本当です。Ant + antlibs + Ivy を使用する賢い人々が大勢いれば、うまく設計されたビルドが完成します。私は Maven が理にかなっていると確信していますが、非常に優秀なビルド エンジニアがいるプロジェクト チームであれば、Ant + Ivy を喜んで使用します。そうは言っても、Jetty プラグインなどの貴重なプラグインを数多く見逃すことになり、時間が経つにつれて必要のない作業をたくさん行うことになると思います。

MavenとAntよりも重要

  1. ソフトウェア成果物を追跡するためにリポジトリマネージャを使用するということです。Nexusをダウンロード中Nexus を使用すると、リモート リポジトリをプロキシし、チームが内部成果物をデプロイする場所を提供できます。
  2. ソフトウェア コンポーネントは適切にモジュール化されています。1 つの大きなモノリシック コンポーネントは、時間の経過とともに拡張されることはほとんどありません。プロジェクトが発展するにつれて、モジュールとサブモジュールの概念が必要になります。Maven は、このアプローチに非常に適しています。
  3. ビルドにはいくつかの規則を採用します。Ant を使用する場合でも、他のプロジェクトと一貫性のある何らかの規則を採用するように努める必要があります。プロジェクトで Maven を使用すると、Maven に精通している人は誰でも、コンパイル方法を理解するために構成をいじる必要がなく、ビルドを選択して実行を開始できます。

おすすめ記事