182

私が見たほぼすべての Java プロジェクトは、Maven または Ant を使用しています。それらは優れたツールであり、どのプロジェクトでも使用できると思います。しかし、何が起こったのでしょか?Java 以外のさまざまなプロジェクトで使用されており、Java を簡単に処理できます。Windows を使用している場合は make.exe をダウンロードする必要がありますが、Ant と Maven には JDK が付属していません。

Java で使用する場合、make に根本的な欠陥がありますか? Ant と Maven が Java で書かれているからでしょうか?

4

17 に答える 17

218

MakeとJavaの基本的な問題は、Makeが依存関係を指定し、次にその依存関係を解決するためのルールを指定しているという前提で機能することです。

基本的なCでは、通常、「main.cファイルをmain.oファイルに変換するには、「ccmain.c」を実行します。

あなたはJavaでそれを行うことができますが、あなたはすぐに何かを学びます。

ほとんどの場合、javacコンパイラの起動には時間がかかります。

の違い:

javac Main.java
javac This.java
javac That.java
javac Other.java

javac Main.java This.java That.java Other.java

昼と夜です。

何百ものクラスでそれを悪化させてください、そしてそれはただ耐えられなくなります。

次に、Javaがディレクトリ内のファイルのグループとして編成される傾向があるという事実と、Cやその他のフラットな構造に向かう傾向があるという事実を組み合わせます。Makeは、ファイルの階層を操作することを直接サポートしていません。

また、Makeは、コレクションレベルで、どのファイルが古くなっているかを判断するのはあまり得意ではありません。

Antを使用すると、古くなったすべてのファイルを調べて合計し、一度にコンパイルします。Makeは、個々のファイルごとにJavaコンパイラを呼び出すだけです。make NOTを実行するには、Makeがタスクに完全に対応していないことを実際に示すのに十分な外部ツールが必要です。

そのため、AntやMavenなどの代替手段が登場しました。

于 2010-02-05T19:48:02.227 に答える
36

由緒あるmakeプログラムは、C や C++ などの個別にコンパイルされた言語を適切に処理します。モジュールをコンパイルすると、それを使用#includeして他のインクルード ファイルのテキストが取り込まれ、単一のオブジェクト ファイルが出力として書き込まれます。コンパイラは、オブジェクト ファイルを実行可能なバイナリにバインドする別のリンク手順を備えた、一度に 1 つずつシステムです。

ただし、Java では、コンパイラは、インポートした他のクラスを実際にコンパイルする必要importがあります。Java ソース コードから必要なすべての依存関係を生成するものを作成してmake、一度に 1 つずつ正しい順序でクラスをビルドすることは可能ですが、それでも循環依存関係などのケースは処理できません。

Java コンパイラーは、他のクラスのコンパイル済みの結果をキャッシュする一方で、既にコンパイル済みのクラスの結果に依存するクラスをさらにコンパイルすることによって、より効率的にすることもできます。makeこの種の自動依存関係評価は、単独では実際には不可能です。

于 2010-02-05T19:37:20.150 に答える
35

実際、make はすべての古い Java ファイルの再コンパイルを 1 つのコマンドで処理できます。ディレクトリ内のすべてのファイルをコンパイルしたくない場合、または特定の順序が必要な場合は、最初の行を変更してください...

JAVA_FILES:=$(wildcard *.java)
#
# the rest is independent of the directory
#
JAVA_CLASSES:=$(patsubst %.java,%.class,$(JAVA_FILES))

.PHONY: classes
LIST:=

classes: $(JAVA_CLASSES)
        if [ ! -z "$(LIST)" ] ; then \
                javac $(LIST) ; \
        fi

$(JAVA_CLASSES) : %.class : %.java
        $(eval LIST+=$$<)
于 2013-12-06T15:29:12.327 に答える
30

この質問は、誤った仮定に基づいています。かなりの数の開発者が を使用していますmakeJava ビルド ツール: Ant と Mavenを参照してください。開発者が を使用しない理由については、make多くの開発者が を使用したことがないかmake、または使用してから 1,000 個の太陽よりも熱く燃える火でそれを嫌っています。そのため、代替ツールを使用します。

于 2010-02-05T19:41:47.993 に答える
17

それぞれの技術的メリットに関する他のすべての答えは真実です。AntそしてMaven、makeよりもJavaに適しているかもしれませんし、Hank Gayが指摘しているように、そうではないかもしれません:)

ただし、AntとMavenがJavaで記述されていることが重要かどうかを尋ねられました。StackOverflowでは、そのような考え(クローズド!プログラミング関連ではない!など)は考慮していませんが、コースの一部です。レールではRakeを使用し、Cの人物はmakeを使用し、JavaではAntとMavenを使用します。AntまたはMaven開発者がおそらく他の開発者よりもJava開発者の面倒を見るのは事実ですが、別の質問もあります。Antタスクを何で記述しますか?Java。あなたがJava開発者なら、それは簡単に適合します。

そうですね、その一部は、ツールを使用している言語で書かれたツールを使用することです。

于 2010-02-05T19:47:09.560 に答える
12

MakeAnt とその後の Maven は、 (プロセスで新しいものを作成している間)によって引き起こされるいくつかの頭痛を解決するように設計されました。それは単なる進化です。

...その後まもなく、いくつかのオープンソース Java プロジェクトは、Ant が Makefile で抱えていた問題を解決できることに気付きました....

http://ant.apache.org/faq.html#historyから

彼らが何かを解決するのか、学習するために追加のフォーマットを作成するだけなのかは、主観的なトピックです. 真実は、それはすべての新しい発明のほとんどの歴史です: 作成者はそれが多くの問題を解決すると言い、元のユーザーはそれらが美徳であると言います.

主な利点は、Java と統合できることです。

たとえば、似たような歴史があると思いrakeます。

于 2010-02-05T19:34:26.077 に答える
9

make よりも Maven (および Ivy 対応の Ant セットアップ) によって解決される主要な問題の 1 つは、依存関係の自動解決と依存関係 jar のダウンロードです。

于 2010-02-05T19:37:43.627 に答える
6

スクリプトを作成すると、本質的にプラットフォームに依存する傾向があります。Javaはプラットフォームに依存しないことになっています。したがって、マルチプラットフォームのソースベースに対して1つのプラットフォームでのみ機能するビルドシステムを使用することは、一種の問題です。

于 2010-02-06T21:44:50.460 に答える
6

最も可能性の高い説明は、いくつかの要因が、重要な時期 (1990 年代後半) に Java コミュニティ内で make の使用を思いとどまらせたということだと思います。

  1. Java は複数のプラットフォームを網羅しているため、一般に Java プログラマーは、一般に Unix 環境に限定されたプログラマー (C および Perl プログラマーなど) ほど Unix ツールに精通していませんでした。これは一般的なものであることに注意してください。間違いなく、Unix を深く理解している才能のある Java プログラマーが存在します。
  2. その結果、彼らは make に不慣れで、make を効果的に使用する方法を知りませんでした。
  3. Java を効率的にコンパイルする短くて単純な Makefile を作成することは可能ですが、プラットフォームに依存しない方法でこれを行うには特別な注意が必要です。
  4. その結果、本質的にプラットフォームに依存しないビルド ツールが求められていました。
  5. Ant とその後の Maven が作成されたのは、この環境でした。

つまり、make は Java プロジェクトに使用できることは間違いありませんが、make を事実上の Java ビルド ツールにする機会が一瞬ありました。その瞬間は過ぎ去りました。

于 2013-03-03T02:29:12.663 に答える
3

AntはMakefilesに対するXML構成指向の改善であり、MavenはAntに対する依存関係構築ツールの改善です。一部のプロジェクトでは、3つすべてを使用しています。JDKプロジェクトでは、makefileとantを組み合わせて使用​​していたと思います。

于 2011-03-17T14:30:39.170 に答える
1

むかしむかし、gmake を使用する Java プロジェクトに取り組みました。私の記憶は曖昧ですが、IIRC は javac が期待するパッケージのディレクトリ構造を処理するのに苦労しました。また、些細なことがなければ、JAR ファイルを作成するのが面倒だったことも覚えています。

于 2010-02-08T19:55:57.887 に答える
1

ApacheAnt は Make のようなものではありません。Make とは、ファイル間の依存関係とファイルのビルド方法を記述することです。Ant は「タスク」間の依存関係に関するものであり、実際にはビルド スクリプトを結合する方法です。

AntVsMakeに役立つかもしれません

于 2014-09-15T09:53:18.077 に答える
1

大きな理由の 1 つは、Ant と Maven (およびほとんどの Java を対象とした SCM、CI、IDE ツール) の両方が、Java 開発者によって、または Java 開発者のために Java で書かれていることです。これにより、開発環境への統合が容易になり、IDE や CI サーバーなどの他のツールがビルド/デプロイ インフラストラクチャ内の ant/maven ライブラリの一部を統合できるようになります。

于 2010-02-05T20:29:57.583 に答える
0

Ant と Maven は、ビルドの依存関係グラフとその管理に、より「現代的な」観点からアプローチしています... しかし、Oscar が言うように、make の古い問題に対処しようとして、独自の問題を作成しました。

于 2010-02-05T19:37:21.947 に答える
0

GNU Make for Java プロジェクトを使用したことはありませんが、以前はjmkを使用していました。残念ながら2002年から更新されていません。

これには Java 固有の機能がいくつかありましたが、サイズを大幅に増やすことなく、ソース tarball に含めるのに十分な小ささでした。

最近では、コードを共有している Java 開発者には Ant がインストールされていると思い込んでいます。

于 2010-02-05T20:16:56.770 に答える