gpt4 book ai didi

java - 为什么java(maven)在编译过程中关心文件时间戳?

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:16 27 4
gpt4 key购买 nike

我有一个项目,我已经工作了几天,终于可以干净地编译它了。但是,同一远程分支(在同一台机器上,在同一终端实例中编译)的 git 克隆导致了编译错误。另一台机器上的新克隆也有同样的错误。我认为这是我的工作目录存在一些额外的未跟踪文件的问题,但我删除了所有未跟踪的文件,直到 diff 表示目录除了 .git 文件夹中包含的内容之外都是相同的。我什至用 tree 检查了权限,并将生成的文件与 meld 进行了比较 - 它们基本上是相同的,尽管一些源文件的执行权限略有不同。

该错误来 self 在 maven-compiler-plugin 中排除的文件。这本质上应该意味着文件名永远不会传递给 javac,尽管我不知道它在幕后是如何工作的。我意识到,如果编译器内部的代码出错,显然编译器会从某个地方获取该文件。在我的计算机上有效的一个目录中,没有错误并且编译完美。在存储库的其他克隆上(根据 diff ,它们再次是相同的),它会在此(排除的)文件上给出错误。

额外的实验表明,在远程分支的新 git clone、本地目录的 cp -R 或本地目录的 git clone 上,编译失败。但是,如果我使用 --archive 选项执行 cp,则在结果目录中进行编译成功。我将其范围缩小到 --preserve=timestamps 标志(由于 --archive-dR --preserve=all 相同而启用该标志)。如果你没听懂,我再说一遍。

当我正常复制目录时,它无法正确编译。仅当保留时间戳时,它的行为才与原始目录相同。

我不明白这一点 - 为什么 java 编译器(或 Maven)关心时间戳?

最佳答案

问题最终是 Maven 编译器插件问题,加上我试图做一些有点误导的事情。

简单来说,编译器插件会传入要编译的每个文件的列表以及源目录的链接。

文件列表非常好,因为这就是 javac 知道要编译哪些内容的方式。然而,源目录也被传递这一事实并不理想。当你将文件(或模式)放入maven编译器插件的<excludes>中时标签,它将不再显示在传递给 javac 的文件列表中。但是,它很可能位于您的源目录中(maven 传递给 javac)。这意味着 javac 仍然可以根据需要编译这些文件,即使您排除了它们。如果其中一个文件是另一个文件的依赖项,则可能会发生这种情况。这里的预期行为是抛出一个错误 - 相反,它编译排除的文件并继续其快乐的方式。

在我的情况下(正如我在评论中所解释的),我遇到了问题,因为一个被明确排除的文件(原因:maven 处理类路径的方式中的一个不相关的错误意味着 maven 无法正确编译该文件)仍在尝试编译,即使我试图提供该类的预编译版本。

在这种情况下,如果我复制文件时没有保留时间戳,它会认为源文件最近已被修改,并且该类的预编译版本已过时。因此 javac 尝试编译排除的文件。只有当我保留时间戳(这表明该文件在几个月内没有被修改)时,javac 才意识到它应该使用提供的 .class 文件。

关于java - 为什么java(maven)在编译过程中关心文件时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11352562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com