Java编译器使用旧版本的源代码

时间:2012-08-16 00:47:12

标签: java javac

我遇到了一个非常烦人的问题,想象一下我编译文件FooBar.java:

  

$ javac FooBar.java

它成功编译,然后像往常一样运行它:

  

$ java FooBar< in.txt

我得到了预期的输出,交易是,如果我更改源代码(FooBar.java)打印别的东西并再次编译它我得到的第一次相同的输出!

这真让我疯了...... javac有没有缓存?即使我删除了FooBar.class并重新编译,我也得到了早期源代码的输出。我找到解决这个问题的唯一方法是删除FooBar.java并创建一个具有不同名称的新文件(我只是复制粘贴代码),这是有效的。

这个错误(?)真的让我烦恼。我已经搜索了解决方案或解释为什么会发生这种情况但没有运气。

这似乎与我的问题有关,但并不完全,因为我没有使用任何IDE,并且Classpath指向我的工作文件夹: http://www.coderanch.com/t/519372/java/java/Executing-Old-Code

我想找出导致这种情况的原因,因为我每次更新源代码时都不想创建新文件...我在Windows上使用Java 1.6.0_27

感谢阅读...

2 个答案:

答案 0 :(得分:1)

是否有包装声明?自从您第一次编译它以来,您可能已经放入了包声明。如果你有包foo.bar,编译器将在foo / bar / FooBar.class中创建.class文件,你应该用java foo.bar.FooBar运行它。如果没有包,它将创建./FooBar.class并通过java FooBar运行它。

答案 1 :(得分:0)

问题不在于缓存。试试这个:

  1. 查看FooBar.class文件上的时间戳(这是RUN)
  2. 再次编译javac ...
  3. 再次查看时间戳。它改变了吗?如果没有,你正在编译到某个地方。
  4. 其他海报对该套餐的评论可以解释这一点。也可以通过设置/更改类路径来解释