AntとMavenの違いを誰かに教えてもらえますか?私も使ったことがありません。Javaプロジェクトのビルドを自動化するために使用されていることは理解していますが、どこから始めればよいかわかりません。
AntとMavenの違いを誰かに教えてもらえますか?私も使ったことがありません。Javaプロジェクトのビルドを自動化するために使用されていることは理解していますが、どこから始めればよいかわかりません。
回答:
Maven:Definitive Guideの、私は、セクションのタイトルが導入における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に正確に何をすべきかを伝える方法を見ることができます。src / main / javaディレクトリ内のソースをtarget / classesディレクトリにコンパイルするjavacタスクを含むコンパイル目標があります。Antにソースの正確な場所、結果のバイトコードを保存する場所、およびこれをすべてJARファイルにパッケージ化する方法を伝える必要があります。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を実行して、JavaDocへのリンクとソースコードに関するいくつかのレポートを含むtarget / siteでindex.htmlファイルを見つけることができます。
確かに、これは可能な限り単純なサンプルプロジェクトです。ソースコードのみを含み、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の違いは何ですか?蟻...
どこMaven ...
mvn install
。このコマンドは、ライフサイクルに達するまで一連のシーケンスステップを実行するようMavenに指示しました。このライフサイクルの旅の副作用として、Mavenは、JARのコンパイルや作成などを行うデフォルトのプラグイン目標をいくつか実行しました。アイビーはどうですか?
そうです、スティーブ・ローランのような誰かがその比較を読んでファウルと呼ぶでしょう。彼は、答えがIvyと呼ばれるものを完全に無視する方法と、AntがAntのより新しいリリースでビルドロジックを再利用できるという事実について話します。これは本当です。Ant + antlibs + Ivyを使用している賢い人がたくさんいる場合、うまく機能するようにうまく設計されたビルドになります。Mavenが理にかなっていると確信していますが、非常に鋭いビルドエンジニアがいるプロジェクトチームでAnt + Ivyを喜んで使用します。そうは言っても、Jettyプラグインなどの多くの貴重なプラグインを見逃してしまうことになると思いますし、時間の経過に伴って行う必要のなかった一連の作業を行うことになるでしょう。
Maven対Antよりも重要
Mavenはフレームワーク、Antはツールボックスです
Mavenは組み立て済みのロードカーですが、Antは自動車部品のセットです。Antを使用すると、自分の車を作成する必要がありますが、少なくともオフロード走行を行う必要がある場合は、適切なタイプの車を作成できます。
別の言い方をすれば、Mavenはフレームワークであり、Antはツールボックスです。フレームワークの範囲内での作業に満足している場合は、Mavenで十分です。私にとっての問題は、私がフレームワークの境界にぶつかり続けて、それが私を出させないことでした。
XMLの冗長性
tobrienはMavenについてよく知っている人で、私は彼が2つの製品の非常に優れた、正直な比較を提供したと思います。彼は単純なMaven pom.xmlを単純なAntビルドファイルと比較し、Mavenプロジェクトがいかに複雑になるかについて言及しました。単純な実際のプロジェクトで見られる可能性が高いいくつかのファイルの比較を見てみる価値があると思います。以下のファイルは、マルチモジュールビルドの単一モジュールを表しています。
まず、Mavenファイル:
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-4_0_0.xsd">
<parent>
<groupId>com.mycompany</groupId>
<artifactId>app-parent</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>persist</artifactId>
<name>Persistence Layer</name>
<dependencies>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>common</artifactId>
<scope>compile</scope>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>domain</artifactId>
<scope>provided</scope>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>${hibernate.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>2.2.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
<scope>test</scope>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons-dbcp.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc</artifactId>
<version>${oracle-jdbc.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>${easymock.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
そして同等のAntファイル:
<project name="persist" >
<import file="../build/common-build.xml" />
<path id="compile.classpath.main">
<pathelement location="${common.jar}" />
<pathelement location="${domain.jar}" />
<pathelement location="${hibernate.jar}" />
<pathelement location="${commons-lang.jar}" />
<pathelement location="${spring.jar}" />
</path>
<path id="compile.classpath.test">
<pathelement location="${classes.dir.main}" />
<pathelement location="${testng.jar}" />
<pathelement location="${dbunit.jar}" />
<pathelement location="${easymock.jar}" />
<pathelement location="${commons-dbcp.jar}" />
<pathelement location="${oracle-jdbc.jar}" />
<path refid="compile.classpath.main" />
</path>
<path id="runtime.classpath.test">
<pathelement location="${classes.dir.test}" />
<path refid="compile.classpath.test" />
</path>
</project>
tobrienは彼の例を使用して、Mavenに組み込みの規則があることを示しましたが、必ずしもXMLの記述が少なくなるとは限りません。私はその反対が真実であることを発見しました。pom.xmlは、build.xmlの3倍の長さであり、規則から逸脱することはありません。実際、私のMavenの例は、プラグインの構成に必要な追加の54行なしで示されています。そのpom.xmlは単純なプロジェクト用です。追加の要件を追加し始めると、XMLは実際に大幅に成長し始めます。これは、多くのプロジェクトでは通常のことです。
しかし、あなたはAntに何をすべきかを伝えなければなりません
上記の私のAntの例はもちろん完全ではありません。クリーンアップ、コンパイル、テストなどに使用するターゲットを定義する必要があります。これらは、マルチモジュールプロジェクトのすべてのモジュールによってインポートされる共通のビルドファイルで定義されます。これは、Mavenでは宣言型であるのに対し、Antでこれらすべてを明示的に記述する必要があるという点に私を導きます。
確かに、これらのAntターゲットを明示的に記述する必要がない場合は、時間を節約できます。しかし、どのくらいの時間ですか?現在使用している一般的なビルドファイルは、5年前に作成したもので、それ以降は少しだけ改良されています。Mavenでの2年間の実験の後、古いAntビルドファイルをクローゼットから引き出して、ほこりを払い、作業に戻しました。私にとって、Antに明確に何をすべきかを伝える必要があるため、5年間で1週間足らずでした。
複雑
次に触れておきたい主な違いは、複雑さとそれがもたらす実際の効果の違いです。Mavenは、ビルドプロセスの作成と管理を担当する開発者の作業負荷を軽減することを目的として構築されました。これを行うには、複雑にする必要があります。残念ながら、その複雑さは意図した目標を否定する傾向があります。
Antと比較すると、Mavenプロジェクトのビルド担当者はより多くの時間を費やします。
対照的に:
親しみやすさ
もう1つの違いは、親しみやすさの違いです。新しい開発者は、速度を上げるために常に時間を必要とします。既存の製品に精通していることがその点で役立ち、MavenサポーターはこれがMavenの利点であると正しく主張します。もちろん、Antの柔軟性は、好きな規則を作成できることを意味します。したがって、私が使用する規則は、ソースファイルをsrc / main / javaというディレクトリ名に置くことです。コンパイルしたクラスは、target / classesという名前のディレクトリに移動します。おなじみの音はそれではありません。
Mavenで使用されるディレクトリ構造が好きです。それは理にかなっていると思います。また、ビルドライフサイクル。したがって、私はAntビルドで同じ規則を使用します。それが理にかなっているだけでなく、以前にMavenを使用したことがある人なら誰でも知っているからです。
pom.xml
sの膨張を回避するために、XSLTを介してそれらのほとんどを生成します。
Antは主にビルドツールです。
Mavenは、プロジェクトおよび依存関係管理ツールです(もちろん、プロジェクトもビルドします)。
Ant + Ivyは、Mavenを回避したい場合は、かなり良い組み合わせです。
さらにいくつかの違いをリストするために:
更新:
これはMaven:The Definitive Guideからのものです。すみません、引用するのをすっかり忘れていました。
MavenまたはAnt?これは非常によく似た質問で、質問への回答に役立ちます。
Mavenとは何ですか?公式サイトで。
編集:新規/グリーンフィールドプロジェクトの場合は、Mavenを使用することをお勧めします。「設定より規約」を使用すると、ビルドスクリプトとデプロイメントスクリプトの記述と設定にかかる時間をかなり節約できます。antを使用すると、ビルドスクリプトは時間の経過とともに複雑さを増す傾向があります。既存のプロジェクトの場合、構成/レイアウトをMavenシステムに組み込むのは難しい場合があります。
Mavenは、依存関係管理ツール(中央リポジトリまたは設定したリポジトリからjarを取得するために使用できる)と宣言型ビルドツールの両方として機能します。「宣言的」ビルドツールと、antやmakeなどの従来のツールとの違いは、実行する方法ではなく、実行する必要があるものを構成することです。たとえば、プロジェクトをWARファイルとしてパッケージ化する必要があるとMavenスクリプトで言うことができ、Mavenはその処理方法を知っています。
Mavenは、その「宣言性」を実現するために、プロジェクトディレクトリがどのようにレイアウトされるかについての規則に依存しています。たとえば、メインコードを配置する場所、web.xml、ユニットテストなどを配置する場所に関する規則がありますが、必要に応じてそれらを変更することもできます。
また、maven内からantコマンドを実行するためのプラグインがあることにも注意してください。
http://maven.apache.org/plugins/maven-ant-plugin/
また、mavenのアーキタイプは、プロジェクトの開始を非常に高速にします。たとえば、Wicketアーキタイプがあります。これは、実行可能なhello worldタイプのプロジェクト全体を取得するために実行するMavenコマンドを提供します。
Antを見たことがない人を連れて行くことができます-そのbuild.xml
sはかなりよく書かれていて-彼らは何が起こっているのかを理解できます。同じ人物を連れてMaven POMを見せれば、彼らは何が起こっているのかまったくわかりません。
巨大なエンジニアリング組織では、Antファイルが大きくなり、管理できなくなると人々は書いています。これらのタイプとクリーンなAntスクリプトを作成しました。これは、今後何をする必要があるのかを事前に理解し、3年以上の変化に対応できるテンプレートセットを設計することです。
単純なプロジェクトでない限り、Mavenの慣習や、Mavenで物事を成し遂げる方法を学ぶのはかなりの作業です。
結局のところ、AntまたはMavenを使用したプロジェクトの開始を要因と見なすことはできません。これは、実際には総所有コストです。組織がビルドシステムを数年にわたって維持および拡張するために必要なことは、考慮しなければならない主な要因の1つです。
ビルドシステムの最も重要な側面は、依存関係の管理と、ビルドレシピを表現する際の柔軟性です。うまくやれば、直感的だと思います。
それはプロジェクトのサイズに依存すると思います...個人的には、コンパイル、パッケージ化、およびデプロイメントが単純である必要がある単純なプロジェクトには、Mavenを使用します。もっと複雑なこと(多くの依存関係、マッピングファイルの作成など)が必要になるとすぐに、Antに切り替えます...
Mavenには、一般的に使用されるオープンソースプロジェクトの大規模なリポジトリも含まれています。ビルド中に、Mavenはこれらの依存関係(および依存関係の依存関係:)をダウンロードして、プロジェクトのビルドのこの部分をもう少し管理しやすくします。