如何解决以另一个类命名的文件中的类的依赖关系

时间:2013-06-02 20:19:37

标签: java class compilation

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

现在,这是“已知”行为(例如,在this answer中报告)。 但是,大多数构建系统似乎没有问题(我尝试过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 {}

1 个答案:

答案 0 :(得分: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