当前位置: 首页 > news >正文

Maven 介绍与核心概念解析

目录

1. pom文件解析

2. Maven坐标

3. Maven依赖范围

4. Maven 依赖传递与冲突解决        


        Maven,作为一个广泛应用于 Java 平台的自动化构建和依赖管理工具,其强大功能和易用性使得它在开发社区中备受青睐。本文将详细解析 Maven 的几个核心概念:pom.xml、Maven 坐标和 Maven 依赖,帮助读者更好地理解和使用 Maven。

1. pom文件解析

        每一个Maven工程都有一个pom.xml文件,位于根目录中,包含项目构建的生命周期的详细信息,通过pom.xml文件,我们可以定义项目的坐标、项目的依赖、项目信息、插件信息等配置。

        一个基础的 pom.xml 示例如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>My Application</name><description>A simple Maven project.</description><dependencies><!-- Dependency examples will be added here --></dependencies>
</project>

以下是一些常用的配置及其作用:

  • <modelVersion>:指定当前 POM 模型的版本,通常为 4.0.0。
  • <groupId>:定义组织或公司的唯一标识符,通常是域名的反转,如 com.example
  • <artifactId>:定义项目在组内的唯一标识符,如 my-app
  • <version>:定义项目的版本号,如 1.0-SNAPSHOT
  • <packaging>:指定项目的打包方式,常见的有 jarwarpom 等。
  • <name>:项目的名称,用于在构建过程中显示。
  • <description>:对项目的简单描述。
  • <dependencies>:列出项目依赖的其他库或模块。
  • <properties>:定义可以在 POM 文件中使用的属性,方便统一管理版本号等。
  • <repositories>:配置额外的远程仓库地址。

2. Maven坐标

        Maven 坐标是标识某个具体构件(如 JAR 包)的唯一标识,项目中依赖的第三方库以及插件可统称为构件,由 groupIdartifactIdversion 三部分组成。有时还包括 packagingclassifier,但通常不是必需的。例如:

groupId: com.example
artifactId: my-app
version: 1.0-SNAPSHOT
packaging: jar
classifier: source

        这些坐标确保了 Maven 可以精确地定位和管理项目中的每一个依赖。在实际使用中,开发者可以通过配置 pom.xml 文件中的 <dependency> 元素来添加所需的依赖。例如:

<dependency><groupId>com.example</groupId><artifactId>my-library</artifactId><version>1.0.0</version>
</dependency>

        在 https://mvnrepository.com/ 这个网站上找到几乎所有可用的构件,如果你的项目使用的是 Maven 作为构建工具,那这个网站你一定会经常接触。

3. Maven依赖范围

        什么是Maven依赖?Maven构建产生的构件被其他项目引用,那么该构件就是其他项目的依赖。

        Maven 提供了不同的依赖范围,以控制依赖的作用域。常见的依赖范围包括:

  • compile:默认范围,编译、测试、运行都需要该依赖。
  • provided:类似 compile,但在打包时不会包含该依赖,期望运行时由容器提供。
  • runtime:编译时不需要,运行时需要。
  • test:只在测试编译和测试运行时需要该依赖。
  • system:类似于 provided,但必须显式指定本地路径。
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.7.0</version><scope>test</scope>
</dependency>

上述是一个只在测试阶段有效的依赖,合理的设置依赖范围,可以优化项目的构建时间和资源使用。

4. Maven 依赖传递与冲突解决        

        Maven 会自动处理依赖之间的传递关系:相同类型但版本不同的依赖存在于同一个 pom 文件,只会引入后一个声明的依赖。项目的两个依赖同时引入了某个依赖但是版本不同,Maven 只会选择其中的一个进行解析。但有时也会发生依赖冲突。这时可以使用 <exclusions> 标签来排除传递依赖中的特定构件,或者通过设置 <dependencyManagement> 统一管理版本。 

        排除传递依赖中的某个特定依赖:

<dependency><groupId>com.example</groupId><artifactId>my-library</artifactId><version>1.0.0</version><exclusions><exclusion><groupId>org.unwanted</groupId><artifactId>unwanted-library</artifactId></exclusion></exclusions>
</dependency>

         使用 <dependencyManagement> 统一管理依赖版本:

<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.8.RELEASE</version></dependency></dependencies>
</dependencyManagement>

http://www.lryc.cn/news/470601.html

相关文章:

  • 计算机网络-MSTP概述
  • Redisson(三)应用场景及demo
  • 考研要求掌握的C语言程度(堆排序)1
  • chronyd配置了local的NTP server之后, NTP报文中出现public IP的问题
  • docker常用命令整理
  • 将CSDN博客转换为PDF的Python Web应用开发--Flask实战
  • AIGC学习笔记(3)——AI大模型开发工程师
  • Windows server 2003服务器的安装
  • HTML作业
  • MYSQL-SQL-04-DCL(Data Control Language,数据控制语言)
  • 多线程进阶——线程池的实现
  • C++网络编程之C/S模型
  • 目标检测:YOLOv11(Ultralytics)环境配置,适合0基础纯小白,超详细
  • 面试域——岗位职责以及工作流程
  • C#文件内容检索的功能
  • Redis-05 Redis发布订阅
  • 【读书笔记·VLSI电路设计方法解密】问题27:什么是可制造性设计
  • 数据结构:堆的应用
  • Spring Boot 实现文件分片上传和下载
  • 夹逼准则求数列极限(复习总结)
  • 【python】OpenCV—WaterShed Algorithm(1)
  • 查找与排序-插入排序
  • JAVA基础:多线程 (学习笔记)
  • 盲盒小程序/APP系统,市场发展下的新机遇
  • Unity3D LayoutGroup组件详解
  • [NeetCode 150] Foreign Dictionary
  • 小新学习K8s第一天之K8s基础概念
  • 如何用终端批量修改一个文件夹里面所有图片的后缀名?
  • 关于AI网络架构的文章
  • 【ChatGPT】在多轮对话中引导 ChatGPT 保持一致性