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

zel*_*ell 2 java javac recompile

我被告知它javac足够聪明,它不会重新编译.java,因为它.java有一个时间戳之前的时间戳.class.我发现它在我的机器中不能像那样工作,我在某处肯定是错的吗?

P.java位于.../eg/access,P.java声明为一个访问包

eg 
 |- access 
      |- P.class
      |- P.java
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*rry 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任务,它足够聪明,能够找出这种情况.

  • 实际上,-Xprefer 修改了类*未在命令行上指定*的搜索首选项。因此,如果我执行 javac Foo.java 并且它引用类 Bar,并且 java 编译器同时找到 Bar.java *和* Bar.class,则此选项指定它将使用哪一个来编译 Foo。它不影响 Foo.java 是否重新编译。请参阅http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#searching (2认同)

Mat*_*ell 5

每次重新编译都是正常的.javac不进行增量编译.