编译时间与运行时间依赖关系 - Java

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

Java中的编译时和运行时依赖关系有什么区别?它与班级路径有关,但它们又有什么不同?

提问于
用户回答回答于

一个简单的例子就是看像api这样的api。为了让你的servlet能够编译,你需要servlet-api.jar,但是在运行时servlet容器提供了一个servlet api实现,所以你不需要将servlet-api.jar添加到你的运行时类路径中。

用户回答回答于
  • 编译时依赖:你需要依赖CLASSPATH来编译你的工件。它们的产生是因为您对代码中的硬编码依赖有某种“引用”,例如调用new某个类,扩展或实现某些内容(直接或间接)或使用直接reference.method()标记的方法调用。
  • 运行时依赖关系:您需要依赖项CLASSPATH来运行您的工件。它们的产生是因为你执行访问依赖项的代码(以硬编码方式或通过反射或其他方式)。

尽管编译时间依赖通常意味着运行时间依赖,但是你可以只有编译时间依赖。这是基于这样一个事实,即Java只在首次访问该类时链接类依赖关系,所以如果您从不在运行时访问特定类,因为从未遍历代码路径,Java将忽略该类及其依赖项。

这个例子

在C.java中(生成C.class):

package dependencies;
public class C { }

在A.java中(生成A.class):

package dependencies;
public class A {
    public static class B {
        public String toString() {
            C c = new C();
            return c.toString();
        }
    }
    public static void main(String[] args) {
        if (args.length > 0) {
            B b = new B();
            System.out.println(b.toString());
        }
    }
}

在这种情况下,A编译时依赖于Cthrough B,但如果在执行时传递某些参数,它只会对C有运行时依赖关系java dependencies.A,因为JVM只会尝试解决何时执行它B的依赖关系。此功能允许您在运行时仅提供您在代码路径中使用的类的依赖关系,并忽略工件中其余类的依赖关系。CB b = new B()

扫码关注云+社区