当前位置: 首页 > 面试题库 >

程序在编译过程中可以依赖库,但运行时不依赖库吗?

习胤运
2023-03-14
问题内容

我了解运行时和编译时之间的区别以及如何区分两者,但是我只是看不到需要区分编译时和运行时 依赖项

我正在cho的是:程序如何在运行时 不依赖 编译期间 依赖
的东西?如果我的Java应用程序使用log4j,则它需要log4j.jar文件才能进行编译(我的代码与log4j集成并从其中调用成员方法)以及运行时(我的代码绝对无法控制log4j内的代码一旦发生了什么.jar已运行)。

我正在阅读诸如Ivy和Maven之类的依赖项解析工具,这些工具显然可以区分这两种类型的依赖项。我只是不明白它的需要。

任何人都可以给出一个简单的“国王的英语”类型的解释,最好给出一个实际的例子,即使像我这样的可怜的树液也能理解?


问题答案:

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

但是,并非严格要求;例如,我们可以针对某个API进行编译,使其具有编译时依赖性,但随后在运行时包括一个也包含API的实现。

在某些情况下,项目需要一定的依赖性进行编译,但实际上并不需要相应的代码,但是这种情况很少见。

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

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



 类似资料:
  • ldd 作用:用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题。示例:查看test程序运行所依赖的库: /opt/app/todeav1/test- ldd test libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000039a7e00000) libm.so.6 => /lib64/libm.so.6 (0x00

  • 即使我添加了这个,当我运行gradle build时,它仍然有效,并且可以编译带有Commons-math3的代码。但是当我在build/中运行jar文件时, 它说异常在线程"main"java.lang.NoClassDefFoundError: org/apache/Commons/math3/Complex/Complex 但Gradle官方网站表示,“编译”中的资源也将包含在“运行时”依赖

  • 目前,我正在尝试使用FCM,但在编译依赖文件时遇到了一个问题。它给出了一个错误,如Under Gradle(模块:app): 错误 请告诉我它无法成功编译的原因。

  • 问题内容: 我正在通过JNI运行一个库(我没有写过),并且在内部它调用了另一个DLL。除非我将另一个DLL的路径放在系统PATH变量上(我在Windows XP上),否则我会收到一条错误消息:“找不到依赖的库”。我希望能够在Java命令行上处理此问题,并且我已经尝试将其添加到- Djava.library.path和classpath中,但都没有起作用(我希望- Djava.library.pat

  • 添加Lib库依赖关系有两种方式: 非管理依赖方式,是通过将依赖的Jar包放到项目的lib目录 管理依赖方式,是在工程构建配置中配置依赖关系,sbt会自动从托管代码库中下载依赖库 非管理依赖方式 很多人用管理依赖的方式替代非管理方式,其实非管理方式用起来非常方便。非管理依赖方式的工作原理就是将jar包放到lib目录下,sbt会自动的将其添加到classpath中。也可以将一些测试依赖放到lib目录下

  • 我正在使用本机库格式OCR,添加jar并将dll放入progfile\common文件中,尽管我遇到以下错误,请帮助我。。。。 ibrary.load不满意LinkError: C:\Program Files\Common Files:无法找到依赖库java.lang.ClassLoader$NativeLoader.load(Native Method)在oader.java:1751Clas