依赖范围和编译classpath、测试classpath、运行classpath的关系

news2024/9/20 18:38:19

最近学习maven,这里看了下别人解释的区别原文,机翻一下,看的懵懵懂懂的

这其实应该是一个简单的区别,但我一直在Stackoverflow上回答一连串类似的问题,而人们往往会误解这个问题。

那么,什么是classpath?一组你的应用程序需要的所有类(和带有类的罐子)。但是有两个,或者说实际上有三个不同的classpaths:

编译时classpath。包含你在你的IDE(假设你使用IDE)中添加的类,以便于编译你的代码。换句话说,这是传递给 "javac
"的classpath(尽管你可能使用的是其他编译器)。 运行时classpath。包含你的应用程序在运行时使用的类。这就是传递给
"java
"可执行文件的classpath。在Web应用中,这是你的/lib文件夹,加上应用服务器/Servlet容器提供的任何其他jars。
test classpath -
这也是一种运行时classpath,但它是在你运行测试时使用。测试不在应用服务器/Servlet容器内运行,所以它们的classpath有点不同
Maven定义了依赖范围,这对于解释不同类型的classpaths之间的差异非常有用。请阅读每个作用域的简短描述。

很多人认为,如果他们成功地编译了有某个jar文件存在的应用程序,就意味着该应用程序可以正常运行。但事实并非如此–你需要你用来编译应用程序的那些jar文件也存在于你的运行时classpath中。好吧,不一定是所有的,也不一定只有这些。举几个例子:

你用编译时classpath上的某个库来编译代码,但忘记把它添加到运行时classpath上。JVM会抛出NoClasDefFoundError,这意味着缺少一个类,而这个类在代码编译时是存在的。这个错误清楚地表明,你在运行时classpath上缺少一个jar文件,而你在编译时classpath上有。也有可能是你所依赖的jar文件反过来又依赖了一个你没有的jar文件。这就是为什么库(必须)声明它们的依赖关系,以便你知道哪些jar应该放在你的运行时classpath上
容器(Servlet容器,应用服务器)有一些内置的库。通常,你不能覆盖内置的依赖关系,即使你可以,也需要额外的配置。因此,例如,你使用Tomcat,它提供了servlet-api.jar。你用servlet-api.jar在你的编译时classpath上编译你的应用程序,这样你就可以在你的类中使用HttpServletRequest,但不要把它包括在你的WEB-INF/lib文件夹中,因为Tomcat会把它自己的jar放在运行时classpath中。如果你重复了这个依赖关系,你可能会得到奇怪的结果,因为类加载器会混淆。
你正在使用的框架(比方说spring-mvc)依赖另一个库来进行JSON序列化(通常是Jackson)。你实际上不需要Jackson在你的编译时classpath上,因为你没有引用它的任何类,甚至没有引用它们的spring类。但是spring内部需要Jackson,所以jackson
jar必须在WEB-INF/lib(运行时classpath)中,才能使JSON序列化工作。
当你考虑到编译时常量和版本不匹配时,情况可能会更复杂,但总的来说是这样的:你用于编译和运行应用程序的classpaths是不同的,你应该注意到这一点。

GPT回答:

classpath是计算机系统中用于查找类文件的路径,它们支持编译、测试和运行Java代码。

  1. 编译classpath指的是编译Java源代码时Javac命令所使用的classpath。在编译过程中,Java编译器需要访问其他类的定义,这些类可能位于Java标准库、公共库或项目自身的类路径中。因此,编译classpath应该包含项目所有必要的依赖项,在编译期间确保正确编译出可执行的class文件。

  2. 测试classpath指的是在执行JUnit测试时类加载器所使用的classpath。在使用JUnit等测试框架进行单元测试时,通常需要从测试类中访问应用程序中的其他Java类。由于测试代码和被测试代码通常处于不同的目录结构中,若在测试代码中直接引用被测试代码中的类,往往会导致ClassNotFoundException。此时需要使用测试classpath来连接这两者之间的依赖,确保测试能够运行。

  3. 运行classpath指的是在运行Java程序时classpath所使用到的依赖项。当使用 java 命令运行Java程序时,将需要指定一个classpath参数来告知JVM如何寻找需要调用的类文件以及其他依赖项。如果程序使用了第三方库或其他外部资源,则可以将相应的.class文件或资源配置到classpath中。

总之,对于不同的应用场景,正确配置classpath才能保证Java代码的编译、测试和运行都能够正常进行。

另外贴一下依赖范围和这三个classpath的区别:
在这里插入图片描述

  • 总之,似乎maven在编译,测试和运行时使用的依赖不尽相同,这些阶段使用的依赖不大一样,例如一个SSM项目,如果你配置了servlet-api的依赖的scope为provided,那么在生成最终的jar包时不会包含这些依赖,但是由于你在程序中使用到了HttpServletRequest这样的类,所以需要引用servlet-api的依赖进行编译,但最终在tomcat中跑的时候是不需要这个jar的,因为tomcat已经提供。
  • 另外一个例子,当我们使用JDBC连接MySQL数据库时,我们往往使用Class.forName()方法,该方法通常用于动态地加载某个类,以及在编译期不能确定具体引用那个类时使用。也就是说我们在使用JDBC时用到的Connection、Statement等对象都是JDK提供的接口,只有在实际运行时才使用到MySQL的驱动,也就是说编译时用不到MySQL的驱动依赖,所以它的scope应该是runtime。【《maven实战》的解释:另外一个例子,当我们使用JDBC连接MySQL数据库时,我们往往使用Class.forName()方法,该方法通常用于动态地加载某个类,以及在编译期不能确定具体引用那个类时使用。也就是说我们在使用JDBC时用到的Connection、Statement等对象都是JDK提供的接口,只有在实际运行时才使用到MySQL的驱动,也就是说编译时用不到MySQL的驱动依赖,所以它的scope应该是runtime】

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

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

相关文章

[CF复盘] Codeforces Round 874 (Div. 3) 20230520】

[CF复盘] Codeforces Round 874 (Div. 3 20230520 总结A. Musical Puzzle![在这里插入图片描述](https://img-blog.csdnimg.cn/01ab8d835b4343659e8b80680dd9d639.png)2. 思路分析3. 代码实现 B. Restore the Weather1. 题目描述2. 思路分析3. 代码实现 C. Vlad Building Beaut…

FinClip | 2023 年 4 月产品大事记

我们的使命是使您(业务专家和开发人员)能够通过小程序解决您的关键业务流程挑战。不妨让我们看看在本月的产品与市场发布亮点,看看它们如何帮助您实现目标。 产品方面的相关动向👇👇👇 全新版本的小程序统…

知识图谱实战应用12-食谱领域智能问答系统,实现菜谱问答

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用12-食谱领域智能问答系统,实现菜谱问答,本项目基于py2neo和neo4j图数据库,将知识图谱应用于菜谱领域。通过构建菜谱知识图谱,实现简单的菜谱食材问答系统。用户可以通过问答系统,快速获取简单的菜谱食材信息。 一…

Vivado综合属性系列之十一 GATED_CLOCK

目录 一、前言 二、GATED_CLOCK 2.1 属性说明 2.2 工程代码 2.3 综合结果 一、前言 在工程设计中,时钟信号通常来源于专用的时钟单元,如MMCM和PLL等。但也存在来自逻辑单元的信号作为时钟,这种时钟信号为门控时钟。门控时钟可以降低时…

Linux下V4l2框架编程_USB摄像头数据采集

Linux内核版本:3.5.0 1.1 V4L2简介 v4L2是针对uvc免驱usb设备的编程框架,主要用于采集usb摄像头等。 这篇文章介绍V4L2框架读取摄像头数据的流程,介绍ioctl常用的命令参数,以及各种摄像头相关的结构体成员含义,最终完成数据采集。 编程模式如下: V4l2支持多种设备,它可…

项目管理PMP好考吗,没有经验?

现在越来越多的产品经理和开发人员也投入到考PMP的大军中,在真实的项目中也会有很多产品经理兼任项目经理的职责,这点还是比较常见的,如果说产品或者开发人员考了PMP证书,本身也会让你在找工作的大军中更具有优势,俗话…

模电基础学习

模拟电路基础 计算机工作原理 用电去控制电,这是计算机工作的核心原理。 电学基础 软件编程更新迭代特别的快,而硬件的学习可能很多年都没有变化,越老越吃香。电路设计好比老中医,学会一个套路就可以用一辈子,因为电路设计是基于物理学原理一直都没有变化过,现在最常用…

SSM编程---Day 01

目录 一、Maven简介 (一)软件开发中的阶段 (二)Maven能做什么 (三)没有使用maven怎么管理依赖 (四)什么是maven (五)maven中的概念 二、Maven的核心概…

【面试题】计算机网络面试实战

version:1.0 文章目录 计算机网络网络分层模型🙎‍♂️面试官:网络为什么要分层?🙎‍♂️面试官:TCP/IP 各层的结构与功能?🙎‍♂️面试官:OSI体系模型的结构和功能&…

AI歌手是否能够取代传统歌手,成为主流音乐的新宠?

⭐ “AI歌手”走红背后:谁在训练它?歌迷为何爱听?⭐ 这种新型演艺模式能否获得广泛的市场认可?⭐ AI歌手会取代流行歌手成为主流吗?⭐ AI还在哪些方面有应用呢? 你听过AI歌手吗?近日&#xff0c…

机器学习 | 降维:PCA主成分分析

本文整理自 长路漫漫2021的原创博客:sklearn基础篇(九)-- 主成分分析(PCA)李春春_的原创博客:主成分分析(PCA)原理详解bilibili视频:用最直观的方式告诉你:什…

结构体入门调试技巧

目录 前言: 一.结构体 1.1结构体的初始化和访问 二.结构体传参 三.调试技巧 3.1VS里的版本 3.2调试功能介绍 四.好代码 4.1const修饰指针的两种位置 五.错误分类 ❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的学习,是为我们今…

蓝桥杯2019年省赛——扫地机器人

题目描述 小明公司的办公区有一条长长的走廊,由 NN 个方格区域组成,如下图所示。 走廊内部署了 K 台扫地机器人,其中第 i 台在第Ai​ 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中,并将该区域清扫干净。 请你…

Java企业级开发学习笔记(4.1)Spring Boot入门程序

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/Qh554】 文章目录 一、使用Maven方式构建Spring Boot项目1.1 创建Maven项目1.2 添加依赖1.3 创建入口类1.4 创建控制器1.5 运行入口类1.6 访问Web页面1.7 修改访问映射路径1.8 定制启动标语1.8.1 …

UE5.1.1C++从0开始(10.作业三)

这次作业量和之前的相比可能会有点大,我先整理一下这次的作业清单: 魔法子弹的飞行声音以及爆炸声音给玩家增加受击的闪亮的效果,和立方体相同的那种增加一个health max的变量,把widget里头的health节点更换为health max节点&…

PythonOCR识别扫描版纯图PDF提取汉字的10大方法,力推RapidOCRPDF 可识别纯图PDF 加密签名的PDF 重点是开源免费,某些方面准确度比百度OCR高

下面实例都以下面的测试样例PDF为实验对象 非纯图可复制pdf 纯图PDF TOP1:RapidOCRPDF 可识别纯图PDF也能识别加密签名的PDF 重点是开源免费 https://github.com/RapidAI/RapidOCRPDF # 基于rapidocr_onnxruntime pip install rapidocr_pdf[onnxruntime]# 基于ra…

多体动力学:哈密尔顿原理的使用

参考资料: HAMILTON’S PRINCIPLE AND HAMILTON’S FORMULATION 原理已经讲得很详细了。如果看不到可以见我的资源,不用积分就可以下载。 步骤: 1.写出拉格朗日表达式 L T − V LT-V LT−V, T T T是系统的动能, V V V是系统的…

二进制安装1.26版本k8s(docker)

文章目录 前言准备工作准备4台虚拟机说明下载对应的二进制包初始化操作CentOS7配置yum源配置免密、修改hostname、关闭防火墙、selinux、关闭swap分区(方便后面进行其它操作)下载软件包并批量安装配置时间同步配置打开文件描述符添加ipvs模块和内核模块 Ubuntu配置apt源配置免密…

【数据结构】---堆排序+TOP-K问题(了解游戏排行底层原理)

文章目录 前言🌟一、建堆的两种方式:🌏1.1 向上调整建堆(堆排序):💫1.1.1 完整代码:💫1.1.2 流程图(以小堆为例):升序:建大堆💫1.1.3 流程图(以小堆为例)&…

python调用海康视频汇聚平台API,获得所有摄像头设备编号、实时播放rtsp地址、回放rtsp地址

目录 1. 需求2. 思路3. 实现3.1. 确保服务器上安装视频汇聚平台(iSecure Center)3.2. 查看API网关是否安装成功3.3. 分配身份认证信息AK/SK3.4. 利用认证信息,python demo开发 1. 需求 海康视频汇聚平台(综合安防管理平台(iSecur…