【问题标题】:Maven/Gradle List out the Compiled ClassesMaven/Gradle 列出已编译的类
【发布时间】:2016-03-20 19:34:40
【问题描述】:

MavenGradle 如果我没记错的话,默认情况下都使用增量构建。

  • 对于全新/首次构建,它将构建所有类文件。
  • 在没有任何更改的下一次构建时,它不会构建任何类文件。
  • 如果我修改 A.java,它会重新编译模块。

是否有任何选项可以获取在此构建中编译的类文件列表?

【问题讨论】:

  • 看看here,它讨论了如何配置 Maven 以记录其构建活动。
  • @TimBiegeleisen,任何仅打印 compiled 类的特定选项。 Info 不打印该信息。在debug 模式下转储不会提供有关我的查询的太多有用信息。

标签: java maven gradle build


【解决方案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 发行版上的 stracewrite 系统调用(与 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 方法。
例如,如果有 package-info.java 文件在我的源目录中,所有的类总是重新编译,即使它们没有改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多