【问题标题】:terminal not overwriting .class files终端不覆盖 .class 文件
【发布时间】:2013-11-23 21:14:21
【问题描述】:

我现在正在学习 Java 编程课程,这是我第一次真正的编程体验(虽然我之前做过一些编程)。对于课程,我必须使用 jEdit 编写程序,并使用终端编译和运行它们(我有一个 mac,出于教育目的,自动编译、运行和调试程序的程序被禁止)。起初对我来说一切都很顺利,但几天前,当我尝试编译它时,终端停止覆盖我的 QuickSort 程序上的 .class 文件。我更改了代码,使其在运行时看起来完全不同,但是在我编译并运行它之后,没有任何变化。但是,如果我在重新编译之前删除了 .class 文件,那么这些更改会在我下次运行它时实现。我和我的老师都找不到关于这个问题的任何信息或如何解决它(完全相同的事情发生在我的一个同学发生在我身上的三天前,我们是班上唯一的 mac 用户)。如果有人知道问题出在哪里,如何解决,或者我在哪里可以找到知道如何解决的人,我将不胜感激。每次编译我的程序时删除五个 .class 文件是一个巨大的痛苦,并且已经给我带来了一些严重的问题。非常感谢您的所有帮助!

*编辑:我正在运行 mac os x 10.8.5

【问题讨论】:

  • 能否请您至少列出您执行的命令以及提供源(和/或目标)目录的简要概述?
  • 段落...当您希望其他人阅读您所写的内容时,最好努力让他们更容易阅读。文字墙会拒绝许多潜在的回答者。
  • 我使用这些命令。 RandomArray 类只是一个测试类,它创建一个随机数组,然后调用排序程序本身。编译该类确实会编译所有必要的类(至少在出现此问题之前它已经编译):“cd desktop/programs/multisorter”和“javac RandomArray.java”

标签: java terminal .class-file


【解决方案1】:

编译器在检测哪些类文件过期方面不够智能,因此要么手动告诉它使用javac *.java 重新编译所有内容,要么使用Ant 等构建工具。


编译器不重新编译所有类的原因是它试图“智能”并通过仅重新编译更改的文件来避免不必要的工作。如果.class 文件比匹配的.java 文件新,则源代码自上次编译以来没有更改,因此不会重新编译该类。

当有多个文件具有依赖链时,这可能会导致问题。考虑这个简单的例子:

// file: A.java
public class A { public static void main(String[] args) { new B().run(); } }

// file: B.java
public class B { void run() { new C().run(); } }

// file: C.java
public class C { void run() { System.out.println("hello world"); } }

第一次编译A 时,编译器看到它引用了B,而后者又引用了C。三个都编译好了,一切正常。

如果修改了B.java 并重新编译了A,编译器会看到A 引用B,并且由于B.javaB.class 更新,它会被重新编译。它不会重新编译C,因为C.java 没有改变。一切都还好。

但是如果C.java 被修改并且A 被重新编译,编译器会看到A 依赖于B,但是由于B.java 没有改变它不会重新编译。所以编译器永远不会到达C 并且即使C.java 已经改变也不会重新编译它。

【讨论】:

  • 非常感谢!你让我的生活变得轻松多了!
猜你喜欢
  • 2014-01-10
  • 2017-05-22
  • 2021-12-05
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多