有关编译和运行时依赖关系及其解决方案的问题?

时间:2014-02-18 14:25:34

标签: java compiler-construction javac

我有以下问题:

  1. 一般来说:什么是编译和运行时依赖
  2. javac编译器如何进行编译时依赖性解析
  3. VM如何执行运行时依赖性解析
  4. 我已经为JLS和JVMS浏览了“依赖”但没有提出任何建议。

2 个答案:

答案 0 :(得分:1)

  

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

  • 编译时依赖性:您需要CLASSPATH中的依赖项来编译工件。生成它们是因为您对代码中的硬编码具有某种“引用”,例如为某些类调用new,扩展或实现某些内容(直接或间接),或者使用直接调用方法调用reference.method()符号。

  • 运行时依赖性:您需要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)构造函数,那么你会得到几个不同的丑陋例外。

答案 1 :(得分:0)

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

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