为什么javac重新编译我的.java虽然.class已经更新了?

时间:2011-11-25 15:38:39

标签: java javac recompile

我被告知javac非常聪明,它不会重新编译.java,条件是此.java的时间戳在.class之前。我发现它在我的机器中不能像那样工作,我在某处肯定是错的吗?

我的P.java位于.../eg/access下,P.java被声明为访问权限

eg 
 |- access 
      |- P.class
      |- P.java

然后当我运行javac P.java时,每次重新编译时,这是正常还是我错了?

3 个答案:

答案 0 :(得分:7)

默认情况下,Javac每次都会重新编译所有内容。您观察到的行为是正确的,并且是设计的。

看起来您可以为此行为指定一个选项:

  

<强> -Xprefer:{更新,源}

     

指定在为类型找到源文件和类文件时要读取的文件。 (请参阅搜索类型)。如果使用 -Xprefer:newer ,它会读取类型的源文件或类文件的较新版本(默认值)。如果使用 -Xprefer:source 选项,则会读取源文件。如果要确保任何注释处理器可以访问使用SOURCE保留策略声明的注释,请使用 -Xprefer:source

取自:http://docs.oracle.com/javase/6/docs/technotes/tools/windows/javac.html

您可能也在考虑Eclipse的编译器,我非常确定它会进行渐进式编译 - 或者是ant中的javac任务,它足够智能以找出这种情况。

答案 1 :(得分:5)

每次重新编译都是正常的。 javac不进行渐进式编译。

答案 2 :(得分:2)

我认为您可能会将javac混淆为javac task in Apache Ant的命令行可执行文件。 javac始终重新编译源文件,无论它是旧文件还是比二进制文件更新。 Ant非常聪明,可以确定何时需要重新编译文件,但当然您必须使用Ant构建系统才能使用此功能。