理解 Maven 依赖范围及编译与运行时的需求

devtools/2024/12/23 7:35:26/

在使用 Maven 构建 Java 项目时,我们经常需要添加各种依赖(JAR 包)到项目中。然而,依赖的作用范围(Scope)决定了这些 JAR 包在不同阶段的作用和存在方式。本文将详细介绍 Maven 依赖范围的定义、编译和运行时的需求,以及如何正确理解这些概念。

Maven 依赖范围(Scope)

在 Maven 的 pom.xml 文件中,依赖的 scope 元素用来定义该依赖的作用范围。常见的作用范围包括:

  1. compile:默认范围。编译、测试、运行和打包时都需要这个依赖。适用于所有阶段。
  2. provided:编译和测试时需要,但在运行时由外部环境提供。适用于如 Servlet API 这样的库,通常由容器(如 Tomcat)提供。
  3. runtime: 编译时不需要,但在运行时需要。适用于 JDBC 驱动程序等库。
  4. test:只在测试阶段需要,不会包含在最终的构建包中。适用于 JUnit 等测试框架。
  5. system:与 provided 类似,但需要在本地文件系统中指定路径,通常不推荐使用。

编译时与运行时的 JAR 包需求

1. 编译时的依赖

编译时,Java 编译器需要知道你代码中所使用的类和接口的定义。如果你在代码中引用了某些类,编译器需要能够找到这些类的定义文件。例如:

  • HttpServletRequestHttpServletResponse:这些类属于 Servlet API。为了编译使用这些类的代码,编译器需要知道这些类的定义。为了达到这个目的,你必须在 pom.xml 文件中将 Servlet API 的依赖 scope 设置为 provided,因为 Servlet API 是由应用服务器(如 Tomcat)提供的。

    <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
    </dependency>
    
  • 编译期依赖的例子:假设你在项目中使用了 HttpServletRequest,编译时需要 javax.servlet-api JAR 包,因为编译器需要知道 HttpServletRequest 类的定义。

2. 运行时的依赖

在代码编译完成后,应用程序在运行时需要不同的依赖来完成实际的操作。运行时依赖是指那些编译时不需要,但在应用程序运行时必须存在的 JAR 包。例如:

  • JDBC 驱动程序:编写数据库操作代码时,使用 JDBC 接口来访问数据库,而不是具体的 JDBC 实现(如 MySQL JDBC 驱动)。因此,编译时不需要 MySQL 驱动程序,但在运行时需要它来实际连接 MySQL 数据库。你需要在 pom.xml 文件中将 JDBC 驱动程序的 scope 设置为 runtime

    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version><scope>runtime</scope>
    </dependency>
    
  • 运行期依赖的例子:在运行时,JVM 需要 MySQL JDBC 驱动来连接数据库。虽然在编译时只需要 JDBC 接口,但运行时需要实际的 JDBC 驱动程序。

编译和运行时的具体示例

示例 1: Servlet API

在编写和编译 Java Servlet 时,必须使用 Servlet API 的类,如 HttpServletRequestHttpServletResponse。这些类的定义由 Servlet API 提供,这意味着在编译阶段,你需要将 Servlet API 的 JAR 包包含在项目中,但实际的 Servlet 容器(如 Tomcat)会在运行时提供这些 API 的实现。

示例 2: JDBC 驱动

假设你的项目使用 JDBC 连接 MySQL 数据库。编写代码时,你使用的是 JDBC 接口(如 ConnectionDriverManager),这些接口由 Java 标准库提供。编译时,编译器不需要 MySQL 驱动程序。只有在实际运行时,JVM 需要 MySQL JDBC 驱动程序来建立数据库连接。

不太明白的同学可以到这里看看----->代码实例

总结

理解 Maven 依赖的范围及其对编译和运行时的需求,对于有效管理项目依赖非常重要。编译时需要的依赖确保你的代码可以顺利编译,而运行时依赖则确保你的应用在实际运行时可以正常工作。通过合理设置依赖的 scope,可以优化项目的构建和运行环境。


http://www.ppmy.cn/devtools/107417.html

相关文章

EmguCV学习笔记 VB.Net 9.2 VideoWriter类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

阶段二 - 小程序反编译及调试

在打开小程序后&#xff0c;小程序的apkg会放在以下目录中&#xff1a; 使用解包工具对小程序进行解包&#xff1a; 解包工具&#xff1a;链接: https://pan.baidu.com/s/1KLDbivGPCPhqt1nbLVbhXA?pwdkckq 提取码: kckq 解包后会生成一个这样的文件&#xff1a; 在这里输…

6、关于Medical-Transformer

6、关于Medical-Transformer Axial-Attention原文链接&#xff1a;Axial-attention Medical-Transformer原文链接&#xff1a;Medical-Transformer Medical-Transformer实际上是Axial-Attention在医学领域的运行&#xff0c;只是在这基础上增加了门机制&#xff0c;实际上也就…

Mac 安装 jdk 8详细教程

Mac 电脑上安装Jdk 8 的步骤很简单&#xff0c;不用想Windows那样需要配置环境变量PATH、JAVA_HOME。 具体方法如下&#xff1a; 首先&#xff0c;去JDK官网下载对应版本的JDK 8。 这里需要注册一个账号&#xff0c;然后&#xff0c;账号下载。 下载完后&#xff0c;得到一个…

应用商店优化(ASO)的四大误区

应用商店优化 (ASO) 是移动营销中最重要的部分之一&#xff0c;可以帮助开发人员吸引自然流量并在应用推广方面取得预期效果。近年来ASO优化在开发者中越来越受欢迎。虽然它已经证明了其有效性和对应用成功的影响力&#xff0c;但尽管如此仍然存在与ASO相关的误解&#xff0c;导…

vscode 远程SSH连接并配置C/C++开发环境

服务器配置 生成用户密钥 ssh-keygen -m PEM -t rsa -b 4096 执行上面的命令后会在 ~/.ssh/ 目录生成密钥&#xff0c;然后导入密钥到认证文件中 cd .ssh/ cat id_rsa.pub >> authorized_keys最后将 id_rsa 传输到宿主机上 宿主机配置 安装插件 配置插件 安装图示…

macos 10.15 catalina xcode 下载和安装

在macos 10.15 catalina系统中, 由于系统已经不再支持,所以我们无法通过应用商店来安装xcode, 需要手动下载指定版本的 xcode 版本才能安装, catalina 支持的最新xcode版本为 Xcode v12.4 (12D4e) , 其他的新版本是无法安装在Catalina系统中的. Xcode_12.4.xip下载地址 注意,下…

【Tomcat源码分析 】“深入探索:Tomcat 类加载机制揭秘“

前言 在探究 Tomcat 类加载机制之前&#xff0c;让我们重温一下 Java 默认的类加载器&#xff0c;加深对其的理解。 如同作者在《深入理解 Java 虚拟机》第二版中所言&#xff0c;类加载机制对于理解 Java 运行时环境至关重要。 什么是类加载机制 Java 虚拟机将描述类的字节…