运行时vs编译时类路径

这确实应该是一个简单的区别,但是我一直在回答有关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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3d 实现顶点动画

在今年GDC上发现一个非常有趣的演讲,叫做Animating With Math,遂实现之,是讲述顶点shader动画的,举了几个经典的例子,但是讲者并没有给代码,而是像虚幻引擎那样的节点,这样更加清楚明了之前博主…

php codeigniter ext,php – 私有服务器上CodeIgniter不正确的系统路径

上传到服务器的codeigniter项目给我以下错误.Your system folder path does not appear to be set correctly. Pleaseopen the following file and correct this: index.php它在当地运作良好在000webhost.com托管.When uploaded to private server of parallels it gives the a…

对于表单的一些想法

表单 <form id"" name"" method"get/post" action""> 其中get提交长度有限制&#xff0c;并且编码后内容在地址栏可见&#xff0c;post与其相反。 </form> 文本输入 文本框<input type"text" id""…

REST端点,可使用Apache Camel进行集成

REST是一种用于组织资源的体系结构样式&#xff0c;当应用于基于HTTP的服务时&#xff0c;REST可以构建无状态的&#xff0c;解耦的&#xff0c;可伸缩的服务。 HTTP方法&#xff0c;HTTP标头和mime类型都允许开发人员实现REST样式。 诸如Jersey和Fuse Services Framework&…

Appium+Python API相关知识了解

首先&#xff0c;要先了解&#xff0c;官方Appium API // https://testerhome.com/topics/3144 刚开始的时候&#xff0c;没有看官方API&#xff0c;然后在网上瞎找学习资料&#xff0c;发现python相关的很少&#xff0c;看了API才知道&#xff0c;就是selenium webdriver的定位…

JSON用于多态Java对象序列化

长期以来&#xff0c;JSON已成为客户端和服务器之间各种数据序列化的事实上的标准。 除其他外&#xff0c;它的优势是简单和易于阅读。 但是&#xff0c;简单起了一些限制&#xff0c;我今天要谈的其中一个限制是&#xff1a;存储和检索多态Java对象。 让我们从一个简单的问题开…

linux 命令分类,常用linux 命令分类整理(篇一)

工作中接触linux时间也不算短了&#xff0c;不同于Windows的图形化操作&#xff0c;使用linux几乎百分之九十五的情况是在命令行下过日子&#xff0c;过去的两年里&#xff0c;零零碎碎整理过一版自己工作中涉及到和学习过的命令(不过常用的只有三十个左右)&#xff0c;思前想后…

考研复习策略

考研复习是一个不容易的过程&#xff0c;有好的策略事半功倍&#xff0c;以我曾经失败的教训和成功的实践给出了我认为不错的策略&#xff0c;只要能做到&#xff0c;我相信一定能考研成功。 院校选择&#xff1a;985院校在选择考研院校是有优势的&#xff0c;院校考虑的因素有…

js中的this指针(二)

在 js 中声明并定义一个函数后&#xff0c;除了定义时传入的形式参数&#xff0c;函数还会接收到 2 个附加的参数&#xff1a;this 和 arguments。 this 指针的值取决于调用时的模式。 当这个函数被保存为对象的一个属性时&#xff0c;它被称为“方法”。当一个方法被调用时&am…

使用AspectJ和Spring简化了AOP

我最近开始研究面向方面的编程&#xff08;AOP&#xff09;&#xff0c;至少可以说使我兴奋。 当然我很熟悉它&#xff0c;因为我看到它在Spring中用于事务管理&#xff0c;但是我从未深入研究它。 在本文中&#xff0c;我想展示通过AspectJ可以快速掌握AOP和Spring。 本文中的…

第一冲刺阶段 工作总结 04

1、昨天我继续我的任务&#xff0c;连接数据库。 2、今天打算继续做数据库的连接。 3、遇到的问题&#xff1a;昨天在数据库连接时&#xff0c;老是连接不上&#xff0c;显示错误&#xff0c;所以今天打算接着弄。转载于:https://www.cnblogs.com/zz0906/p/5422510.html

windows2012同步linux时间,Windows server2012时间同步NTP配置

遇到经常服务器时间无法同步&#xff0c;可以自己建立一台时间同步服务器&#xff0c;NTP配置如下&#xff1a;一、服务端配置 (Ntp服务器&#xff0c;客户端将根据这台服务器的时间进行同步)1、微软键R键&#xff0c;进入“运行”&#xff0c;输入“regedit”,进入注册表2、 H…

反差萌

反差萌 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 0 Accepted Submission(s): 0 Problem Description有2N个人&#xff0c;每人有个萌值Mi(1<i<2N)。 要求将他们分为N对&#xff0c;使得反差值之和…

Java EE 6示例– Galleria第2部分

您可能在最后一篇Java EE 6 Galleria示例帖子中关注了我。 第一个是基本介绍。 第二个是关于在最新的GlassFish上运行它。 有人提到RedHat&#xff0c;我们应该研究将这个示例从GlassFish中移除。 很好;&#xff09;感谢您的好主意。 这正是我们今天要做的。 我将把Galleria示例…

suggest

http://lovebeyond.iteye.com/blog/941633转载于:https://www.cnblogs.com/sunxun/p/5421251.html

linux的tar命令压缩26g文件,linux如何使用tar命令大包压缩进文件

linux如何使用tar命令大包压缩进文件发布时间&#xff1a;2020-05-29 12:30:14来源&#xff1a;亿速云阅读&#xff1a;206作者&#xff1a;Leah本篇文章主要介绍linux中使用tar命令大包压缩进文件的方法。内容比较详细&#xff0c;文章包含了命令的使用示例&#xff0c;希望大…

与reCAPTCHA的Spring集成

有时我们只需要CAPTCHA &#xff0c;这是一个可悲的事实。 今天&#xff0c;我们将学习如何与reCAPTCHA集成。 因为主题本身并不是特别有趣和高级&#xff0c;所以我们将通过使用Spring Integration处理低级细节来过度设计&#xff08;&#xff1f;&#xff09;。 Google决定使…

《机器学习基石》---感知机算法

1 推导感知机模型 基本思想是&#xff0c;把特征的线性加权值作为一个分数&#xff0c;根据这个分数与一个门限值的关系来进行分类&#xff1a; 我们加一个特征x0等于1&#xff0c;门限值就可以放到w里面去&#xff0c;得到更简单的形式&#xff1a; 这就是感知机模型&#xff…

未知错误:1000正在终止线程

若在try{} catch{}的catch 块中加入 catch (Exception ex) { Response.Write(ex.Message); Response.End(); } 则捕获异常后&#xff0c;提示未知错误&#xff1a;1000正在终止线程 转载于:https://www.cnblogs.com/dennysong/p/5422567.…

分叉并加入Java 7 – JSR 166并发实用程序

Java 7最有趣的改进之一是对并发的更好支持。 使用JSR 166并发实用程序&#xff0c;我们可以对并发进行一些非常有用的改进。 在我看来&#xff0c;fork-join库在软件工程中具有很高的实际应用潜力。 Fork and join为算法提供了非常简单的编程模型&#xff0c;可以将其实现为递…