当类路径中存在类时,如何防止隐式Java编译?

时间:2012-06-01 20:12:41

标签: java classpath javac

假设我有两个班级(鲍勃和汤姆),鲍勃使用汤姆,但汤姆不需要鲍勃。这两个文件都位于相同的目录结构中。

public class Bob {
  public static void main(String[] args) {
    System.out.println(Tom.MESSAGE);
  }
}

public class Tom {
  public static String MESSAGE = "Hello World";
}

如果我尝试以典型的方式编译Bob,我可以让它隐式编译Tom.java,因为它被识别为Bob.java的依赖项。这很好用。

但现在让我们说我想把Tom放在一个JAR文件中。所以我构建Tom.java并将结果放入JAR文件:libTom.jar。我现在使用指向libTom.jar的类路径进行编译。不幸的是,编译器会看到Tom.java文件并导致它被编译而不是使用libTom.jar中的类。如果在类路径中找到类,有没有办法让编译器跳过Tom.java的隐式构造?

我认识到这个例子是相当人为的。请放心,围绕这个问题有一个更复杂,更少做作的用例。感谢。

4 个答案:

答案 0 :(得分:1)

如果类路径中有两个具有相同名称且位于同一个包中的类,则很难预测当java编译代码时哪个类会被拾取。如果源本身中存在Tom类,它肯定会被拾取。

您可以避免的一种方法是将Tom中的一个放在不同的包中。另一种方法是,您可以将当前的Tom移动到单独的项目中。我知道其中任何一个对你来说可能都不实用。如果确实有必要,您可以尝试编写自己的ClassLoader。请参阅此问题以供参考:Jar hell: how to use a classloader to replace one jar library version with another at runtime

答案 1 :(得分:0)

是的,您可以通过键入类的全名来实现,即键入

的System.out.println(the.package.of.external.Tom.MESSAGE);
的System.out.println(the.current.package.Tom.MESSAGE);

答案 2 :(得分:0)

您可以将java文件拆分为单独的源目录吗? 这是有意义的,因为你可以从一个源目录的内容构建你的jar,然后在编译所有其他文件集时只包括其他源目录。 这在Eclipse中运行良好。 更好的方法是在Eclipse中使用两个项目。

答案 3 :(得分:0)

看起来这是不可能的,这是我从一开始就担心的。