介绍
Maven是一个流行的构建工具和项目管理工具,它主要用于Java项目的构建、依赖管理和项目报告生成。Maven通过提供一致的项目结构、自动化的构建过程和强大的依赖管理,简化了项目的开发和维护过程。
下面是一些Maven的主要特点和用途:
-
项目结构管理:Maven规定了一种标准的项目目录结构,使得项目的组织和管理更加统一和规范化。这样可以方便开发者共享项目,并且降低新成员加入项目的学习成本。
-
构建工具:Maven可以自动化执行项目的构建过程,包括编译源代码、运行测试、打包、部署等。通过定义项目的构建生命周期和插件,Maven可以轻松执行这些任务,提高开发效率。
-
依赖管理:Maven提供了强大的依赖管理功能,可以自动下载和管理项目所依赖的第三方库和框架。通过在项目配置文件(pom.xml)中定义依赖关系,Maven可以自动解析、下载和导入所需的依赖项,大大简化了项目的依赖管理。
-
插件系统:Maven支持丰富的插件系统,可以通过插件扩展和定制构建过程。开发者可以使用已有的插件或编写自己的插件,以满足特定的项目需求。
-
跨平台支持:Maven是基于Java开发的,因此可以在多个操作系统上运行,并且能够管理不同类型的项目,而不仅仅局限于Java项目。
简单来说maven就是一个软件,这个软件的作用就是帮助你快速构建你的Java项目 帮助你更好的管理和构建依赖,还有一个非常好的好处就是说,当我们使用idea编写时 不借助maven的情况下 文件的目录结构和eclipse是不同的 ,这就导致使用不同版本的代码时,我们会需要下载不同编译器来构建对应的项目,而maven成功解决了这个问题,只要保证配置没有问题 ,那么可以直接进行编写程序和运行程序。
使用maven的好处
- maven可以帮助快速打包项目 比如说将一个web项目打包成jar/war之后放到服务器中。(可以直接使用命令来打包成指定的格式 maven package)
- 依赖管理:可以管理项目的依赖 ,自动下载所需的依赖库,并且保证版本没有冲突,依赖版本管理。
- 构建管理:maven可以帮助管理项目的编译,测试,打包,部署等过程,通过实现标准的构建生命周期,maven可以确保每一个构建过程遵循同样的规则和最佳实践。
maven标签的规定
遵循GAV的规则:
Maven标签的规定主要遵循GAV(GroupID、ArtifactID、Version)的命名规则。具体规定如下:
GroupID
GroupID是项目的唯一标识符,通常采用反向域名的方式命名,以保证全球唯一性。根据Maven的规定,GroupID应该由三部分组成:公司/BU名称、业务线名称、子业务线名称。例如,com.example.project可以表示一个名称为project的项目,它属于example公司,业务线为project。
ArtifactID
ArtifactID是项目的名称,它也必须是唯一的。ArtifactID通常是一个短名称,用来描述项目或模块的名称。例如,如果项目名称是myproject,则ArtifactID通常会是myproject。
Version
Version是项目的版本号,用于区分不同版本的项目。每次发布新版本时,Version都应该被更新。版本号通常采用三位数字进行表示,例如1.0.0、1.1.0等。
maven怎么导入依赖呢?
我们使用jackson做一个例子
直接在pom.xml中进行配置
外层的dependencies标签表明里面的都是依赖 可以把他理解成是一个依赖集合
内层的一级标签 dependency标识这是个依赖内容
groupId项目唯一标识
artifactId项目名称
version项目的版本信息
规定完成之后直接 重新加载项目
maven项目的一些特点
依赖传递:
依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B,而 B 又依赖于模块或库 C,那么A会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。当我们引入一个库或框架时,构建工具(如 Maven、Gradle) 会自动解析和加载其所有的直接和间接依赖,确保这些依赖都可用。
依赖传递的作用是:
- .减少重复依赖:当多个项目依赖同一个库时,Maven 可以自动下载并且只下载一次该库。这样可以减少项目的构建时间和磁盘空间。
- 自动管理依赖: Maven 可以自动管理依赖项,使用依赖传递,简化了依赖项的管理,使项目构建更加可靠和一致。
- 确保依赖版本正确性:通过依赖传递的依赖,之间都不会存在版本兼容性问题,确实依赖的版本正确性!
简单的说依赖传递就是指,当某个项目A依赖于项目B,并且项目B又依赖于项目C时,依赖传递机制会自动将项目C的依赖项也引入到项目A中。这样,项目A就可以直接使用项目B的功能,而不需要手动添加项目C的依赖。
也就是我写了一个A项目 A项目需要用到B项目 当我下载A的时候也顺带下了关联的B项目
依赖冲突
根据依赖传递的规定很容易发现一个bug那就是
也就是说A依赖于B B依赖于C 那么我们会发现一个现象 这就是一个死循环问题,A下载B ,B下载C, C下载A成为一个闭环问题。
依赖冲突的规定:发现已经存在依赖(重复依赖) 会终止依赖传递!避免循环依赖和重复依赖的问题!
依赖冲突的原则
- 第一原则:
谁短谁优先,引用路径长度。
比如说: - 表示依赖
A-C-B(1.0)
F-B(2.0)
最后的版本结果 A C F B(2.0) - 第二原则
谁上谁优先!dependencies声明的先后顺序
A-B 1.0
F-B 2.0
最终结果 A-F-B 1.0
maven出现失败的场景
本地仓库被污染
当本地文件没有这个依赖但是并不访问阿里云中央仓库 此时就要先删除污染源 然后继续请求 删除掉本地maven仓库缓存
扩建构建管理和插件配置
使用命名来进行配置和处理
-
mvn clean:清理项目,删除生成的目标文件和临时文件。
-
mvn compile:编译项目源代码。
-
mvn package:将项目打包为可发布的格式,如JAR或WAR。
-
mvn install:将项目打包并安装到本地Maven仓库,以供其他项目引用。
-
mvn deploy:将项目打包并部署到远程Maven仓库,用于共享和分发。
-
mvn test:运行项目的测试用例。
-
mvn site:生成项目的文档网站。
-
mvn dependency:tree:显示项目的依赖树,展示项目所依赖的库及其版本。
-
mvn clean install:清理项目并进行完整的构建,包括编译、打包和安装。
-
mvn clean package:清理项目并进行打包,生成可发布的包。
maven的继承
在Maven中,继承是一种机制,允许您在项目之间共享和重用构建配置。Maven继承的主要目的是减少重复性的配置,使得在多个项目中更容易维护和管理构建过程。以下是Maven继承的关键概念:
父项目(Parent Project:父项目是一个包含通用配置的Maven项目,它定义了项目的基本结构、插件、依赖等信息。子项目可以继承自一个父项目。
子项目(Child Project):子项目是继承自父项目的项目。子项目可以继承父项目的配置信息,也可以覆盖或添加自己的配置。
继承关系:继承是通过在子项目的pom.xml文件中使用元素来实现的。子项目通过指定父项目的groupId、artifactId和version来建立继承关系。
Copy code
<parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version>
</parent>
这样子项目就会继承父项目的配置信息。
默认值的覆盖:子项目可以覆盖父项目的配置。例如,可以在子项目中重新定义插件的版本或添加新的插件,而无需重新定义整个插件配置。
继承的优点:
代码重用:通过继承,可以在多个项目中重用相同的构建配置。
统一管理:父项目提供了一个集中管理和更新配置的地方,可以确保所有子项目保持一致。
减少冗余:避免在每个项目中重复相同的配置,减少维护成本。
多层次继承:Maven支持多层次的继承结构,即子项目可以再定义新的父项目,形成一个继承链。这样的结构可以更灵活地组织项目。