这确实应该是一个简单的区别,但是我一直在回答有关Stackoverflow的许多类似问题,并且经常有人误解此事。

那么,什么是类路径? 应用程序所需的一组所有类(以及带有类的jar)的集合。 但是有两个或实际上三个不同的类路径:

  • 编译时的类路径。 包含您在IDE中添加的类(假设您使用IDE)以编译代码。 换句话说,这是传递给“ javac”的类路径(尽管您可能正在使用其他编译器)。
  • 运行时类路径。 包含运行应用程序时使用的类。 那就是传递给“ java”可执行文件的类路径。 对于Web应用程序,这是您的/ lib文件夹,以及应用程序服务器/ Servlet容器提供的任何其他jar
  • 测试类路径–这也是一种运行时类路径,但是在运行测试时使用。 测试不在您的应用程序服务器/ servlet容器中运行,因此它们的类路径有些不同

Maven定义了依赖范围,这对于解释不同类型的类路径之间的区别非常有用。 阅读每个范围的简短说明 。

许多人认为,如果他们在存在给定的jar文件的情况下成功编译了该应用程序,则意味着该应用程序将正常运行。 但这并不需要-您需要与用于编译应用程序的jar相同的jar才能出现在运行时类路径中。 好吧,不一定所有的人,也不一定只有他们。 一些例子:

  • 您可以使用编译时类路径上的给定库来编译代码,但是忘记将其添加到运行时类路径中。 JVM抛出NoClasDefFoundError,这意味着缺少一个类,该类在编译代码时存在。 此错误是一个清楚的信号,表明您在运行时类路径上缺少编译时类路径上的jar文件。 反过来,您依赖的jar也有可能取决于您在任何地方都没有的jar。 这就是为什么(必须)声明库的依赖关系的原因,以便您知道要在运行时类路径上放置哪些jar
  • 容器(Servlet容器,应用程序服务器)具有一些内置库。 通常,您不能覆盖内置的依赖项,即使可以,它也需要其他配置。 因此,例如,您使用提供了servlet-api.jar的Tomcat。 您可以使用编译时类路径上的servlet-api.jar来编译应用程序,以便可以在类中使用HttpServletRequest,但不要将其包含在WEB-INF / lib文件夹中,因为tomcat会将其自己的jar放入运行时类路径。 如果您重复依赖项,则可能会得到奇怪的结果,因为类加载器会感到困惑。
  • 您正在使用的框架(例如spring-mvc)依赖于另一个库进行JSON序列化(通常是Jackson)。 实际上,您在编译时的类路径上不需要Jackson,因为您没有引用它的任何类,甚至没有引用它们的spring类。 但是spring内部需要Jackson,因此jackson jar必须位于WEB-INF / lib(运行时类路径)中,才能进行JSON序列化。

当您考虑编译时常量和版本不匹配时,情况可能会更加复杂,但是一般的要点是:您用于编译和运行应用程序的类路径是不同的,您应该意识到这一点。

参考: Bozho的技术博客博客中的JCG合作伙伴 Bozhidar Bozhanov的 运行时类路径与编译时类路径 。

翻译自: https://www.javacodegeeks.com/2012/04/runtime-vs-compile-time-classpath.html

运行时vs编译时类路径相关推荐

  1. 交叉编译指定运行时库路径_运行时vs编译时类路径

    交叉编译指定运行时库路径 这确实应该是一个简单的区别,但是我一直在回答有关Stackoverflow的许多类似问题,并且经常有人误解此事. 那么,什么是类路径? 应用程序所需的一组所有类(以及带有类的 ...

  2. java运行时_java编译时与运行时概念与实例详解

    Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念. 基础概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只 ...

  3. GCC:编译时库路径和运行时库路径

    假设有如下依赖关系的一个程序: m 依赖于a a 依赖于b //a.c #include <stdio.h>void b(); void a() {printf("Here is ...

  4. 使用matlab进行mex编译时的路径问题mexopts

    matlab和vs 进行混合编程时总须要使用matlab编译mexFunction.cpp文件. 这些文件免不了使用include下的*.h和lib下的*.lib文件.举例说明.这次我的cpp中用到了 ...

  5. matlab mex路径,使用matlab进行mex编译时的路径问题mexopts

    matlab和vs 进行混合编程时总需要使用matlab编译mexFunction.cpp文件.这些文件免不了使用include下的*.h和lib下的*.lib文件.举 matlab和vs 进行混合编 ...

  6. 获取eclipse 运行时,bundle的相对路径

    File file = FileLocator.getBundleFile(bundle).getCanonicalFile(); 转载于:https://www.cnblogs.com/oscar1 ...

  7. java launcher_JAR清单类路径不仅适用于Java Application Launcher

    java launcher 自从我开始学习Java以来​​,我几乎已经知道, 清单文件中的Class-Path标头字段为可执行JAR (具有由另一个称为Main-Class清单指定应用程序起点的 JA ...

  8. JAR清单类路径不仅适用于Java Application Launcher

    自从我开始学习Java以来​​,我几乎已经知道, 清单文件中的Class-Path标头字段为可执行JAR (具有由另一个称为Main-Class清单指定应用程序起点的 JAR)指定相对运行时类路径. ...

  9. Java 面试题问与答:编译时与运行时

    在开发和设计的时候,我们需要考虑编译时,运行时以及构建时这三个概念.理解这几个概念可以更好地帮助你去了解一些基本的原理.下面是初学者晋级中级水平需要知道的一些问题. Q.下面的代码片段中,行A和行B所 ...

最新文章

  1. SAP QM 检验批录入了结果以后不能再Reset检验计划了?
  2. 科沃斯机器人双十一全渠道成交额超7亿 两大爆款单品携手破亿
  3. Web开发-Django模型层
  4. json文件读取之reader.onload中的定义的变量在其函数外部进行处理
  5. 学成在线--0.项目概述
  6. 基于android新闻阅读器,Readian News是一款基于Android和网络的新闻阅读器,可让您掌控一切...
  7. NameNode之数据块管理
  8. AFNnetworking详解
  9. 巧用gmail转发邮件
  10. 受力分析软件_管桁架结构的受力特点是什么?如何计算?
  11. 关于DIPS的MVC 4.0项目发布与在IIS 7.0上的部署的方法
  12. 领域驱动设计实践合订版(战略+战术)
  13. 3D建模学习对于电脑配置要求高不高?用台式机好还是笔记本电脑好?显卡内存等全方面解析,小白福音
  14. 股份有限公司按规定注销库存股时,对被注销库存股的账面余额超过面值总额的部分
  15. [Unity ECS] 游戏对象转换和子场景 [1]
  16. PhotoShopnbsp;CS5nbsp;官方中文正式原版下…
  17. Matlab基础知识五
  18. 特征选择 Relief 方法
  19. c语言工业键盘确认键,工业键盘的基础知识
  20. 免费云服务器使用体验

热门文章

  1. Mac 环境变量配置
  2. 使用腾讯云发送短信API接口实现(完整流程)
  3. lambda层保存模型出错_保存您的lambda,以备不时之需-保存到文件
  4. spark应用程序_Sparklens:Spark应用程序优化工具
  5. ejb生命周期_EJB 3.x:生命周期和并发模型(第1部分)
  6. java lambda循环_在Java 8 Lambda中创建自己的循环结构
  7. q7goodies事例_Java 8 Friday Goodies:新的新I / O API
  8. 使用JWT的Cloud Native应用程序
  9. [MEGA DEAL]完整的Java编程训练营(94%)
  10. jaxb 命名空间_在JAXB解组期间应用名称空间