2015-12-15 54 views
5

MavenGradle都默認使用增量構建,如果我沒有弄錯的話。Maven/Gradle列出編譯類

  • 對於新鮮/第一次構建,它會構建所有的類文件。
  • 在下一次構建時沒有任何更改,它不會生成任何類文件。
  • 如果我修改A.java,它會重新編譯模塊。

是否有任何選項可以獲取在此版本中編譯的類文件的列表?

+0

看看[這裏](http://stackoverflow.com/questions/3441013/getting-a-build-logfile-by-maven),它討論瞭如何配置Maven來記錄它的構建活動。 –

+0

@TimBiegeleisen,只打印「編譯」類的任何特定選項。 「Info」不打印該信息。在「調試」模式下轉儲不會提供有關我的查詢的很多有用信息。 – 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 

您也可以稍微深一點到你的操作系統和跡線(例如,strace在某些Linux發行版上)write syscalls(posix compliant platforms)和grep .class正在寫入的文件。

你也可以使用選項-Dmaven.compiler.fork=true,其中叉號javac(它曾經是一個默認的,但不再明顯)。您可以跟蹤通過臨時文件傳遞的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以重新編譯。不過,我現在可以看到,它要複雜得多,爲了理解原因,我建議調試Maven執行,並查看AbstractCompilerMojo.java及其execute方法。
例如,如果在我的sources目錄中有package-info.java文件,即使沒有更改,也會始終重新編譯所有類。