我有一个项目,我已经工作了几天,我终于把它编译干净了。但是,同一远程分支的 git clone(在同一台机器上,在同一终端实例中编译)导致编译错误。另一台机器上的新克隆有同样的错误。我认为这是我的工作目录有一些额外的未跟踪文件的问题,但我删除了所有未跟踪的文件,以至于diff
除了 .git 文件夹中包含的内容之外,这些目录是相同的。我什至检查了权限tree
并将生成的文件与它们进行了比较meld
——它们基本上是相同的,尽管一些源文件的执行权限略有不同。
该错误来自我在 maven-compiler-plugin 中排除的文件。这本质上应该意味着文件名永远不会传递给 javac,尽管我不知道它到底是如何工作的。我意识到如果编译器内部的代码出错,编译器显然会从某个地方获取文件。在我的计算机上可以运行的一个目录中,没有错误并且可以完美编译。在 repo 的其他克隆上(根据 ,它们再次相同diff
),它在这个(排除的)文件上给出了一个错误。
额外的实验表明,在git clone
远程分支、cp -R
本地目录或本地目录的新分支git clone
上,编译失败。但是,如果我使用该--archive
选项执行 cp,则结果目录中的编译成功。我将其缩小到--preserve=timestamps
标志(由于与--archive
相同而启用-dR --preserve=all
)。如果你没听清楚,我会再说一遍。
当我正常复制目录时,它拒绝正确编译。只有当时间戳被保留时,它的行为才会与原始目录相同。
我不明白这一点 - 为什么 java 编译器(或 maven)关心时间戳?