14

我只是想知道这一点,当我给 mvn install 而不做'clean'时,maven 只编译修改后的 java 文件。maven如何识别java文件是否被修改?我相信它没有使用文件的最后修改属性。

我相信的原因:我有一个模块,在合并来自 svn 的更改后,我给了 mvn install 并且它没有编译修改后的文件,当我查看更改时,我看到“long”被修改为“long”吸气剂和二传手。

所以我只想知道 maven 如何识别 java 文件是否已更改?

(PS 我正在使用 Apache Maven 3.0.3,如果这很重要的话)

4

3 回答 3

16

我相信 Maven 编译器插件使用源文件和类文件的最后修改日期来确定是否需要重新编译。

编译器网站的信息相当短,但compiler:compile目标页面有关于以下属性的信息,可以微调过时计算:http ://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html #staleMillis。这是关于陈旧性的唯一官方声明。

于 2012-08-02T07:42:46.627 回答
6

Without knowing much about maven, I can tell you that generally speaking, "make"-like tools use the "last changed" timestamp, which would explain the issue you had with svn ( see Wikipedia on Subversion's weaknesses.

于 2012-08-02T07:48:09.253 回答
0

Robert Scholte 在https://issues.apache.org/jira/browse/MCOMPILER-205的评论解释了这个过程。它取决于“maven-compiler-plugin”的“useIncrementalCompilation”选项(顺便说一句,我只设法让“useIncrementalCompilation”与 3.1 一起工作,而不是 3.0):

我看到有些混乱,所以需要改变一些东西,也许改进文档就足够了。查看代码,您会发现非增量只会查看更改的源文件。Incremental 还将验证依赖项是否已更改以及文件是否已添加或删除。如果它已更改,它将删除完整的类目录。原因是默认的 java 编译器非常快,可能比分析每个文件要快得多。IIUC eclipse 编译器是一个真正的增量编译器,所以我们可以根据使用的编译器决定不删除类目录。

于 2018-06-03T15:28:52.467 回答