2015-12-15 8 views
5

MavenGradleは、私が間違っていないとデフォルトでインクリメンタルビルドを使用しています。Maven/Gradleコンパイルされたクラスをリストアップ

  • 新しく/最初のビルドでは、すべてのクラスファイルをビルドします。
  • 変更なしで次にビルドすると、クラスファイルは作成されません。
  • A.javaを変更すると、モジュールが再コンパイルされます。

このビルドでコンパイルされたクラス・ファイルのリストを取得するための任意のオプションがありますか?

+0

Mavenにビルドアクティビティを記録するように設定する方法について説明している[こちら](http://stackoverflow.com/questions/3441013/getting-a-build-logfile-by-maven)をご覧ください。 –

+0

@TimBiegeleisen、 'compiled'クラスだけを出力する特定のオプションです。 'Info'はその情報を表示しません。 'debug'モードでのダンプは、私のクエリに関する多くの有益な情報を与えません。 – Reddy

答えて

1

maven.compiler.verboseはいかがですか?私はtrueに設定した場合

は、私はどちらか

% mvn compile -Dmaven.compiler.verbose=true 2>&1 | grep class 
[INFO] Nothing to compile - all classes are up to date 

取得したり、私がA.javaファイル

% mvn compile -Dmaven.compiler.verbose=true 2>&1 | grep class | grep wrote 
[wrote RegularFileObject[/tmp/mvn-compile/target/classes/A.class]] 
[wrote RegularFileObject[/tmp/mvn-compile/target/classes/B.class]] 

... and other similar output 

を変更する場合にも、あなたのOSおよびトレース(例えば、straceに深い少しを得ることができますいくつかのLinuxディストリビューションでは)write syscalls(posix準拠のプラットフォーム)と書かれているファイル.classをgrepします。

また、javacというフォークのオプション-Dmaven.compiler.fork=trueを使用することもできます(これはデフォルトでは使用されていましたが、もはやはっきりしません)。 javacの引数は、一時ファイル(javacの実行中にのみ存在します。たとえば/tmp/org.codehaus.plexus.compiler.javac.JavacCompiler2179201625419771061arguments)を介して渡されます。 catこのファイルを参照し、再コンパイルするjavacに渡されるファイルを確認することもできます。それは私の場合は(Mac OS X)では、このファイルは/tmpに保存され、出力に、私は単純に

% cd /tmp; while true; do ls org.codehaus.plexus.compiler.javac.JavacCompiler* | xargs cat; sleep 1; done 
zsh: no matches found: org.codehaus.plexus.compiler.javac.JavacCompiler* 
zsh: no matches found: org.codehaus.plexus.compiler.javac.JavacCompiler* 
zsh: no matches found: org.codehaus.plexus.compiler.javac.JavacCompiler* 
"-d" 
"/tmp/mvn-compile/target/classes" 
"-classpath" 
"/Users/stepan/.m2/repository/com/typesafe/config/1.3.0/config-1.3.0.jar:/Users/stepan/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.6.4/jackson-core-2.6.4.jar:" 
"-sourcepath" 
"/tmp/mvn-compile/src/main/java/A.java" 
"/tmp/mvn-compile/src/main/java/B.java" 
"-s" 
"/tmp/mvn-compile/target/generated-sources/annotations" 
"-g" 
"-verbose" 
"-nowarn" 
"-target" 
"1.8" 
"-source" 
"1.8" 
"-encoding" 
"UTF-8" 

を実行するもう一つの問題は、Mavenのは、再コンパイルするクラスを決定する方法です。私が正しく覚えていれば、それは.javaのファイルと一致するファイルの.classのタイムスタンプの比較に基づいていました。 .javaファイルが新しい場合は、javacに追加されて再コンパイルされます。しかし、私は今すぐ見ることができます、それはもっと複雑で、その理由を理解するために、私はデバッグを実行することをお勧めしますAbstractCompilerMojo.javaとそのexecuteメソッドを見てください。
たとえば、ソースディレクトリにpackage-info.javaというファイルがある場合、すべてのクラスは変更されていなくても常に再コンパイルされます。

関連する問題