有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

假设我有两个类(Bob和Tom),Bob使用Tom,但Tom不需要Bob。这两个文件位于同一目录结构中

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。罐子现在,我使用指向libTom.jar的类路径进行编译。不幸的是,编译器看到了Tom.java文件,并导致对其进行编译,而不是使用libTom.jar中的类。如果类在类路径中找到,有没有办法让编译器跳过Tom.java的隐式构造

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


共 (4) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    这似乎是不可能的,这是我从一开始就担心的

  3. # 3 楼答案

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

    系统。出来println(外部Tom消息的.package.of.external.MESSAGE)
    系统出来println(当前.package.Tom.MESSAGE)

  4. # 4 楼答案

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