gpt4 book ai didi

java - 程序可以在编译期间依赖库而不是运行时吗?

转载 作者:IT老高 更新时间:2023-10-28 11:23:59 25 4
gpt4 key购买 nike

我了解运行时和编译时之间的区别以及如何区分两者,但我只是认为没有必要区分编译时和运行时依赖关系

我哽咽的是:一个程序如何不依赖在运行时依赖于它在编译期间所依赖的东西?如果我的 Java 应用程序使用 log4j,那么它需要 log4j.jar 文件才能编译(我的代码与 log4j 内部的成员方法集成并调用成员方法)以及运行时(我的代码完全无法控制 log4j 内部的代码会发生什么.jar 已运行)。

我正在阅读 Ivy 和 Maven 等依赖关系解析工具,这些工具清楚地区分了这两种类型的依赖关系。我只是不明白它的必要性。

谁能给出一个简单的,“国王的英语”式的解释,最好是一个即使像我这样的可怜虫也能理解的实际例子?

最佳答案

运行时通常需要编译时依赖项。在 maven 中,compile 范围的依赖项将在运行时添加到类路径(例如,在 war 中,它们将被复制到 WEB-INF/lib)。

但是,这不是严格要求的;例如,我们可以针对某个 API 进行编译,使其成为编译时依赖项,但随后在运行时包含一个也包含该 API 的实现。

可能会有项目需要一定的依赖才能编译但实际上并不需要相应代码的边缘情况,但这种情况很少见。

另一方面,包括在编译时不需要的运行时依赖项是很常见的。例如,如果您正在编写 Java EE 6 应用程序,您可以针对 Java EE 6 API 进行编译,但在运行时,可以使用任何 Java EE 容器;正是这个容器提供了实现。

使用反射可以避免编译时依赖。例如,可以使用 Class.forName 加载 JDBC 驱动程序。并且实际加载的类可以通过配置文件进行配置。

关于java - 程序可以在编译期间依赖库而不是运行时吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7070570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com