Maven
和Gradle
默认使用增量版本。
是否有任何选项可以获取在此版本中编译的类文件列表?
答案 0 :(得分: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
您还可以深入了解您的操作系统和跟踪(例如,某些Linux发行版上的strace
)write
系统调用(符合posix标准的平台)并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
文件,即使它们没有被更改,也会重新编译所有类。