【问题标题】:Questions on compile- and run-time dependencies and their resolution?关于编译和运行时依赖关系及其解决方案的问题?
【发布时间】:2014-03-18 09:06:48
【问题描述】:

我有以下问题:

  1. 一般来说:什么是编译和运行时依赖项
  2. javac 编译器如何进行编译时依赖关系解析
  3. VM 如何解决运行时依赖关系

我已经浏览了 JLS 和 JVMS 的“依赖”,但没有提出任何建议。

【问题讨论】:

    标签: java compiler-construction javac


    【解决方案1】:

    一般来说:什么是编译和运行时依赖项

    • 编译时依赖项:您需要 CLASSPATH 中的依赖项来编译您的工件。它们的产生是因为您对代码中硬编码的依赖项有某种“引用”,例如为某个类调用 new,扩展或实现某些东西(直接或间接),或者使用直接 @987654325 的方法调用@ 表示法。

    • 运行时依赖项:您需要 CLASSPATH 中的依赖项来运行您的工件。它们的产生是因为您执行访问依赖项的代码(以硬编码方式或通过反射或其他方式)。

    取自:Compile time vs Run time Dependency - Java 然而,much detailed reference is available on Jenkov's website

    javac 编译器如何进行编译时依赖解析

    它会查看您的类路径和源路径以找到必要的依赖项。

    VM 如何进行运行时依赖解析

    JVM 并不完全关心依赖解析,AFAIK。 JVM 所做的是在需要时从类路径加载类。 例如,当你的程序(比如 A 类)第一次命中时:

    // in class A
    F x = new F(42);
    

    F 类将被加载。

    如果未找到该类,则会收到 ClassNotFoundException。如果您在 A 的编译和执行之间更改了 F 类,并删除了例如 F(int) 构造函数,那么您会得到几个不同的丑陋异常。

    【讨论】:

      【解决方案2】:

      “依赖”是比 JVM 所关心的更高级别的抽象。那里有许多依赖管理系统,例如MavenGradle,但它们中的每一个都运行在 JVM 之上,而不是它本身的一部分。

      您会在 Java 平台文档中找到“链接”;即,JVM 如何使用类或接口的名称来定位加载程序的其他部分所需的字节码。 Java 通过称为classpath 的机制来做到这一点。可以通过环境变量、构建系统或在运行程序时在命令行配置类路径。

      【讨论】:

        猜你喜欢
        • 2020-10-07
        • 1970-01-01
        • 2014-10-24
        • 2014-12-29
        • 2011-03-17
        • 2014-10-23
        • 1970-01-01
        • 2020-05-27
        • 2017-10-07
        相关资源
        最近更新 更多