1

Java 允许每个文件有多个顶级类声明,条件是这些类中最多有一个是公共的。

但是,Oracle Java 编译器似乎无法解决这些依赖关系。考虑:

// One.java
package jtest;
import jtest.Three;
public class One {}

// Two.java
package jtest;
public class Two {}
class Three {}

第一次编译尝试以错误结束:

javac -cp . jtest\One.java

jtest\One.java:3: error: cannot find symbol
import jtest.Three;
            ^
  symbol:   class Three
  location: package jtest
1 error

然而,这按预期工作

javac -cp . jtest\Two.java
javac -cp . jtest\One.java

现在,这是“已知”行为(例如,在这个答案中报告了)。但是,大多数构建系统似乎都没有与场景有关的问题(我尝试过 Eclipse 和 Apache Buildr)。他们如何解决问题?

还要考虑 Eclipse 和 Apache Buildr 都可以编译它而无需担心:

// One.java
package main;
import main.Four;
public class One {}
class Three {}

// Two.java
package main;
import main.Three;
public class Two {}
class Four {}
4

1 回答 1

3

javac 编译器可以一起编译多个源文件,这使它能够处理循环依赖。

例如:

$ javac main/One.java main/Two.java

或者

$ javac main/*.java

如果你拿最后一个例子,一次只做一个文件,它注定会失败,因为你最终会遇到鸡或蛋的问题,这意味着每个文件都需要另一个文件已经编译。

当您对 ant 中的源目录使用该任务时,它会扫描目录中的所有 .java 源文件并将它们一起传递到 Java 编译器的实例中。这样,编译就可以理清依赖关系。

这两个页面有很好的细节:

http://www.dummies.com/how-to/content/how-to-use-the-javac-command.html http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows /javac.html

于 2013-06-02T21:46:29.337 回答