2011-01-11 35 views
30

「mvnコンパイル」と「mvnクリーンコンパイル」の実行の主な違いは実用的には何であるか疑問に思っています。Mavenでは、なぜ 'mvn clean'を実行するのですか?

"mvn clean compile"は生成されたすべてのファイルを削除してから最初からやり直しますが、なぜこれをやりたいのですか?私は "mvn compile"が必要であればファイルを再生成すると思いますか?

プロジェクトで気づいたことは、ソースファイルを削除してクリーンで実行しないと、コンパイルされたファイルが残っていることです。通常は問題はありませんが、おそらくそれは可能でしょう。

+0

興味深い質問です。私は、c/C++アプリケーションに "make"を使用すると、ソースファイル間の依存関係を処理するときにクリーンであることはよくありません。私はそれが削除/名前の変更のケースも処理すると思います。 –

答えて

15

正しく動作させるには、特定のプラグインにはcleanが必要です。例えば(少なくともMaven 2では)maven-war-pluginは、それぞれの従属WARを既存のディレクトリツリーに分解します。依存するWARから削除されたファイルを取り除くには、cleanが必要です。

もう1つの問題は、クラスの名前を変更するときに、古いコンパイル済みのバージョンがビルドツリーにぶら下がり、mvn cleanを実行するまでJARファイルなどに組み込まれるということです。

"mvn compile"が必要な場合はファイルを再生成すると仮定できますか?

メインストリームプラグインの場合、これは正当な前提です。しかし、プラグインを使用してソースコードコンポーネントを生成している場合は、ドキュメントと生成されたソースコードをどこに置いているかを注意深く見ていきます。例えば、Eclipse EMFコードジェネレータを駆動することを目的とした、サポートされていないプラグインがいくつかあります。

+1

私はしばしば "mvnコンパイルテスト"で "作業中"のコードで捕まっていますが、実際には "mvnクリーンコンパイルテスト"では動作しません。 – schmmd

24

例:クラス名を変更すると、cleanを実行するまで、以前のコンパイル済みバージョンはtarget/classesのままになります。これは完全に無害かもしれませんが、クラスパススキャンなどで自動検出されると問題が発生する可能性があります。

+0

はい、これはビルドサーバーでテスト検出を実行したときの問題でした。 –

+0

ビルドサーバーでの定義は、たびにきれいなテストを実行する...非常に遅くする必要はありませんし、不必要な頭のスクラッチ(十分な時間のメイヴェンで必要な頭をたくさんのスクラッチを防ぐ) –

+0

だから - なぜドンビルドの依存関係を適切に処理するためにMavenを修正するか、少なくとも「クリーン」をデフォルトにするか? – joeking

1

をMavenでコンパイルするたびに、 "mvn clean"を実行するのがベストプラクティスです。あなたが最後にコンパイルしたときにコンパイルした既存のクラスをクリアします。 3行を実行したくない場合は、 "mvn clean"の後に "mvn test"を実行してください。あなたはいつも "mvn compile"を行う必要はありません。

0

クリーンコンパイルを実行しないと、廃止されたクラスで作業することができます。あなたのモジュールが新しいクラスに移行すると仮定した場合でも、それを逃したとしても、古いクラスがターゲット/クラスに存在するため、コンパイルエラーは発生しません。これは、同じモジュールがクリーンなコンパイルの目標を持つ他の場所/マシンに構築されるまで気づかれないままです。

関連する問題