2012-08-16 69 views
-1

我遇到一个很烦人的问题对我来说,我想象编译文件FooBar.java:Java编译器是使用旧版本的源代码

$ javac的FooBar.java

它编译sucefully然后我运行它像往常一样:

$ java的FooBar的< in.txt

我得到了预期的输出结果,如果我改变源代码(FooBar.java)来打印其他东西并重新编译,我会得到与第一次相同的输出!

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

这个错误(?)真的让我烦恼。我寻找解决方案或解释为什么发生这种情况,但没有运气。

这似乎是因为我没有使用任何IDE和类路径指向我的工作文件夹可能与我的问题,但不完全: http://www.coderanch.com/t/519372/java/java/Executing-Old-Code

我想找出是什么导致这是我不不想做一个新的文件,每次我更新的源代码...我在Windows上使用Java 1.6.0_27

感谢您的阅读...

+0

您是如何编译的?您是否使用Eclipse之类的IDE?对不起,没有看到“我不使用IDE”。你用什么命令来编译?如果您删除.class文件,会发生什么情况? – km1 2012-08-16 00:56:48

+0

正如我所说,我正在使用** javac **。如果我删除.class文件并重新编译,问题仍然存在......它会编译旧代码... – 2012-08-16 00:59:41

+0

删除类文件,请勿编译并运行java命令。这将验证您运行的是与您认为的不同的类文件。 – km1 2012-08-16 01:02:22

回答

0

该问题不会被缓存。试试这个:

  1. 看看你的FooBar.class文件的时间戳(这是什么RUN)
  2. 做你的编译再次的javac ...
  3. 看时间戳记一次。它改变了吗?如果没有,你正在编译到某处。
  4. 其他海报对包装的评论将解释这一点。这也可以通过设置/更改课程路径来解释
+0

谢谢。这个问题是由于我试图编译一个与已经编译的.jar文件名称相同的文件。我通过删除.class文件并运行它来得出这个结论:java -v foobar 我发现正在运行的.class是在.jar中,而不是我通过更改代码所得到的.class。 已解决问题。 :) – 2012-08-17 17:12:00

+0

@ andre.nunes因此,您的类路径必须包含该jar文件以及您的工作文件夹,与您的问题中陈述的内容相反。 – EJP 2015-07-03 00:06:30

1

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

+0

没有包,它是一个带有一些数组操作的简单类,最后是一个System.out.println()。我刚刚添加了另一个println(),输出没有改变 – 2012-08-16 01:15:28

+0

这可能不是OP的问题,但它是我的!谢谢! – jrahhali 2015-07-01 20:08:04