1. 坐标和依赖
maven的一大功能就是管理项目依赖,为了能够自动化地解析任何一个java构件,maven就必须将它们一一标识,这就是依赖管理的基础——坐标。
1.1 坐标
重复地搜索、浏览网页和下载类似的jar文件,可以交由计算机来做。而计算机工作必须基于预定义的规则,maven中定义了这样一种规则:任何一个构件都可以使用maven坐标进行唯一标识,maven坐标的元素包括groupId, artifactId, version, packaging, classfier。
maven中坐标各个元素的解释如下:
groupId:定义当前maven项目隶属的实际项目。maven项目和实际项目可能不是一对一的关系。
artifactId:该元素定义实际项目的一个maven项目(模块),推荐的做法是使用实际项目的名称作为artifactId前缀。
version:定义maven项目当前所处的版本。maven定义了一整套完成的版本规范,以及快照的概念。
packaging:定义maven项目的打包方式。打包方式通常与所生成构件的文件扩展名对应,比如jar,war;打包方式会影响构建的生命周期。
classfier:帮助定义构建输出的一些附属构件。附属构件与主构件对应,比如通常jar包会存在javadoc, sources等附属jar包,这些附属组件也有着唯一的坐标。
在上述5个元素中,groupId, artifactId, version是必选的,packaging是可选的,classfier是不能直接定义的。
1.2 依赖
在pom中定义project下的dependencies元素可以包含一个或者多个dependency元素来声明一个或者多个项目依赖。
每个依赖可以包含的元素主要有:
元素 |
含义 |
groupId, artifactId, version |
依赖的基本坐标 |
type |
依赖的类型,对应于坐标的packaging,默认jar |
scope |
依赖的范围 |
optional |
标记依赖是否可选 |
exclusions |
用来排除传递性依赖 |
1.3 依赖范围
maven在编译项目主代码时需要使用一套classpath,编译项目主代码时需要用到的jar包会以依赖的方式被引入到classpath中。
maven在编译和执行测试这两个阶段会使用不同的classpath。
依赖范围就是用来控制与这三种classpath(编译classpath,测试classpath,运行classpath)的关系。maven中有以下几种依赖范围:
依赖范围 |
含义 |
compile |
编译依赖范围,默认范围。对于编译,测试,运行三种classpath都有效。 |
test |
测试依赖范围。只对于测试classpath有效,在编译主代码和运行主程序中不会被用到。例如junit |
provided |
已提供依赖范围。对于编译和测试classpath有效,但在运行时无效。例如servlet-api |
runtime |
运行时编译依赖,对于测试和运行classpath有效,但在编译主代码时无效。例如数据库驱动。 |
system |
系统依赖范围,和provided依赖范围完全一致,但必须通过systemPath显示指定依赖范围的路径,往往与本机系统绑定,谨慎使用 |
import |
导入依赖范围。不会对三种classpath有影响。 |
2. 仓库
maven中任何一个依赖,插件或者项目构建的输出,都可以称为构件。在不是用maven的项目中,我们往往发现每个项目中都包含类似/lib的目录用来存储依赖的jar包,而且各个项目的lib包往往包含重复的内容。
maven项目使用任何一个构件的方式都是完全相同的,maven可以在某个位置统一存储所有maven共享的构件,这个统一的位置便是仓库。
2.1 仓库的布局
任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径,这就是maven的仓库布局方式。
在对应maven的用户.m2文件夹下,存在一个repository文件夹,其中存放着所有本地存储的jar包,maven的仓库时基于简单文件系统存储的。
基于构件的groupId用来准备路径,其中的.分隔符转换成路径分隔符。
基于构件的artifactId准备路径,前面的基础上加上artifactId路径分隔符。
使用的依赖版本信息。
如果构件中包含classifier,就加上构件分隔符和classifier。
检查构件的extension,若存在则加上句点分隔符和extension。
2.2 仓库的分类
对于maven来说,仓库只分为两类:本地仓库和远程仓库。当maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在,直接使用;如果本地仓库不存在,需要查看是否有更新的构件版本,maven就会去远程仓库寻找,发现需要的构件之后,下载到本地仓库再使用。如果都没有找到,maven会报错。
中央仓库是maven核心自带的远程仓库,包含了绝大多数开源的构件。默认配置下,本地仓库没有maven需要的构件,它会尝试从中央仓库中寻找。
私服是另一种特殊的远程仓库,为了节省网络带宽和下载时间,应该在局域网中架设一个私有的仓库服务器,用来代理所有外部的远程仓库。
相关推荐
这里的`groupId`、`artifactId`和`version`共同构成了Maven坐标,用于唯一标识一个项目或库。Maven会根据这些信息从Maven中央仓库或其他指定的远程仓库下载对应的jar文件。 Maven的依赖机制遵循“传递性”原则,这...
这里的`groupId`、`artifactId`和`version`共同构成了Maven坐标,用于唯一标识一个依赖。Maven会根据这个坐标从中央仓库或其他配置的远程仓库下载对应的JAR文件。 Maven依赖管理遵循“传递性”原则,即如果你的项目...
当本地仓库没有所需依赖时,Maven会尝试从远程仓库下载。 6. **排除依赖(exclude)**:有时候我们可能需要排除某个特定的子依赖,可以使用exclude标签来实现。例如: ```xml <groupId>com.example</groupId> ...
在POM中声明所需依赖,Maven会根据设定的坐标(groupId、artifactId、version)从Maven中央仓库或其他指定的远程仓库下载对应的jar包。例如,`<dependency>`标签用于声明项目依赖,`<dependencies>`标签则用于包含...
Maven仓库是存储项目依赖的地方,分为中央仓库和本地仓库。中央仓库是默认的依赖源,包含了大量开源项目的jar包。而本地仓库则是Maven在本机上创建的一个临时存储库,用于缓存从远程仓库下载的依赖。 当"JxBrowser...
本文将深入探讨"Maven本地仓库依赖环境"的相关知识点。 首先,Maven本地仓库是每个Maven用户机器上默认存储所有下载的依赖库的地方。它位于用户主目录下的`.m2`文件夹内,路径通常是`~/.m2/repository`。当Maven...
Maven使用一种基于坐标(groupId、artifactId、version)的系统来管理这些依赖,使得开发者可以轻松地引用并下载所需的库。下面将详细介绍Maven本地仓库的工作原理、配置以及其在开发过程中的作用。 ### Maven仓库...
这三部分构成了Maven坐标,使得每个库在仓库中都能被唯一识别。以下是一些常用的Maven仓库搜索服务网站,你可以通过它们来查找你需要的jar包: 1. **Sonatype Nexus** (https://repository.sonatype.org): ...
2. **Maven坐标**:在Maven中,每个依赖由三部分组成,即groupId(表示项目或组织的唯一标识)、artifactId(项目或模块的标识)和version(该组件的版本号)。 3. **依赖的传递性**:如果项目A依赖于B,B又依赖于C...
这通常包括Jeesite框架的各个版本的JAR文件,以及其依赖的各种第三方库,如Spring、MyBatis、Shiro等的Maven坐标对应的JAR包。 【压缩包子文件的文件名称列表】中的“repository”可能是指Maven的本地或远程仓库...
在这个例子中,'com\'暗示了groupId可能是'com.artofsolving\',这是一个假设的组织名,实际的groupId应在解压前查看Maven依赖的完整坐标。 标签“jodconverter”、“maven”、“jar”和“java”揭示了几个关键点:...
Java Maven 本地仓库包大全是Java开发者不可或缺的资源集合,它包含了各种开源库、框架、工具的JAR文件,使得开发人员在构建项目时能够快速便捷地引用这些依赖。Maven是一个强大的项目管理和构建工具,它通过管理...
在“自己使用的maven本地仓库2”中,我们可以看到这是一份个人开发者积累的私有Maven仓库,包含了许多常用或特定项目的依赖,以便在后续的开发工作中快速获取和复用。 Maven的本地仓库是每个Maven用户机器上的一个...
在Grails 3.2.8中配置Maven依赖,你需要在POM.xml文件中指定依赖的坐标(groupId, artifactId, version)。例如,如果需要添加一个名为`my-plugin`的Grails插件,其坐标可能是`org.grails.plugins:my-plugin:1.0.0`...
解压`maven-repo`后,你会看到一系列按照Maven坐标(groupId、artifactId、version)结构组织的文件夹,其中包含`.jar`文件(库文件)、`.pom`文件(项目对象模型,描述项目信息和依赖)以及其他相关资源。...
假设`QRCode.jar`的Maven坐标为`com.qrcode:qrcode:1.0.0`,在你的项目的`pom.xml`文件中,你可以添加以下依赖: ```xml <groupId>com.qrcode</groupId> <artifactId>qrcode <version>1.0.0 ``` 添加完...
Maven引入了中央仓库的概念,所有依赖的JAR包都被集中管理在一个地方(本地仓库),这样就可以实现: - **依赖管理**:只需要在项目配置文件(pom.xml)中声明所需的依赖即可自动下载并管理。 - **版本控制**:...