Maven
和Gradle
都默認使用增量構建,如果我沒有弄錯的話。Maven/Gradle列出編譯類
- 對於新鮮/第一次構建,它會構建所有的類文件。
- 在下一次構建時沒有任何更改,它不會生成任何類文件。
- 如果我修改A.java,它會重新編譯模塊。
是否有任何選項可以獲取在此版本中編譯的類文件的列表?
Maven
和Gradle
都默認使用增量構建,如果我沒有弄錯的話。Maven/Gradle列出編譯類
是否有任何選項可以獲取在此版本中編譯的類文件的列表?
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
文件,即使沒有更改,也會始終重新編譯所有類。
看看[這裏](http://stackoverflow.com/questions/3441013/getting-a-build-logfile-by-maven),它討論瞭如何配置Maven來記錄它的構建活動。 –
@TimBiegeleisen,只打印「編譯」類的任何特定選項。 「Info」不打印該信息。在「調試」模式下轉儲不會提供有關我的查詢的很多有用信息。 – Reddy