maven学习总结

众所周知,maven的两大作用是项目构建和依赖管理,除此之外,基于多模块项目,maven常用的功能还有模块化管理。

项目构建

Maven是一个构建工具,可以根据项目中的配置文件(pom.xml)来自动执行项目的构建过程。它可以将源代码编译、运行单元测试、生成可执行的JAR或WAR文件等。

Maven定义了一组标准的构建生命周期,如clean、validate、compile、test、package、install、deploy等。这些生命周期阶段分别对应不同的构建任务,使得构建过程更加规范化和可管理。

当使用Maven构建项目时,项目的构建过程被划分为不同的阶段,每个阶段执行特定的任务。以下是Maven构建生命周期中几个常用阶段的解释:

clean: 该阶段的目标是清除之前构建生成的输出。它会删除先前构建生成的目录,例如target目录,以便从头开始执行构建。命令:mvn clean

validate: 在该阶段,Maven会验证项目是否正确,包括项目结构、POM文件格式和基本配置。这可以帮助在构建过程的早期发现潜在的问题。命令:mvn validate

compile: 在这个阶段,Maven会编译项目的源代码(通常位于src/main/java目录下)。它将Java源文件编译成字节码文件(.class文件)。命令:mvn compile

test: 在该阶段,Maven会执行项目的单元测试。它会搜索并执行位于src/test/java目录下的测试代码,然后生成测试报告。如果测试失败,构建过程可能会中止。命令:mvn test

package: 在这个阶段,Maven会将编译后的代码打包。对于Java项目,它通常会创建一个包含编译后字节码、资源文件等的JAR(Java Archive)或WAR(Web Archive)文件。命令:mvn package

install: 在这个阶段,Maven会将打包后的文件安装到本地仓库,以供其他项目引用。这对于多模块项目或模块之间的依赖非常有用。命令:mvn install

deploy: 最后一个阶段是部署阶段。在这个阶段,Maven会将构建好的包上传到远程仓库,以便其他团队成员或项目可以访问和使用这些构建产物。命令:mvn deploy

依赖管理

Maven通过管理 pom.xml 文件中的依赖配置,自动下载、安装和管理项目所需的外部库和框架,使得依赖管理变得更加简单和规范化。这有助于减少版本冲突、依赖错误等问题,同时提高了项目的可维护性和稳定性。总的来说,依赖管理包含下面这些方面

POM文件: 项目的依赖管理主要在项目根目录下的 pom.xml 文件中完成。POM(Project Object Model)是Maven项目的核心配置文件,其中包含了项目的元信息、依赖配置、插件配置等。

依赖坐标: 在 pom.xml 中,你可以通过定义依赖项的坐标来指定你需要使用的外部库或框架。依赖坐标通常包括组织(Group)、名称(Artifact)和版本号(Version)等信息,这些信息唯一标识了一个依赖项。

依赖范围: Maven支持不同的依赖范围,如compile、test、provided等。每个依赖范围定义了依赖项在不同上下文中的使用情况。例如,compile 范围表示该依赖在编译、运行和测试阶段都可用,而 test 范围表示该依赖仅在测试阶段可用。

传递性依赖: 当一个依赖项本身还依赖于其他库时,Maven会自动处理这些传递性依赖。它会从远程仓库下载所需的所有依赖项,并确保它们按正确的顺序添加到项目的类路径中。

依赖解析: 当你在 pom.xml 中定义依赖后,Maven会根据依赖坐标从远程仓库中解析并下载相应的依赖文件。这些文件通常以JAR(Java Archive)格式存在。

本地仓库: Maven会将下载的依赖文件保存在本地仓库中,以避免重复下载。默认情况下,本地仓库位于用户主目录下的 .m2 文件夹。

快照和稳定版本: 依赖的版本号可以是稳定版本(如 1.0.0)或快照版本(如 1.0.0-SNAPSHOT)。稳定版本是已发布的正式版本,而快照版本是开发中的版本。快照版本可以通过频繁的构建来更新。

上面提到的依赖范围用于定义依赖项在不同上下文中的使用情况。不同的依赖范围决定了在哪些构建阶段以及哪些上下文中可以使用该依赖项。以下是常见的依赖范围以及它们的解释:

compile: 这是默认的依赖范围。在 compile 范围内定义的依赖项将会在项目的编译、运行和测试阶段都可用。这些依赖项会被包含在生成的JAR或WAR文件中,以便在运行时使用。

provided: 在 provided 范围内定义的依赖项表示它们在编译和测试阶段可用,但在运行时由容器(例如Servlet容器)或其他环境提供。这意味着你不需要在项目中包含这些依赖的JAR文件,因为它们将在运行时环境中可用。

runtime: 在 runtime 范围内定义的依赖项将在运行时和测试阶段可用,但不会在编译阶段包含在生成的JAR或WAR文件中。这对于在运行时需要,但不需要在编译时使用的依赖项很有用。

test: test 范围内定义的依赖项仅在测试代码中可用。它们不会被包含在生成的JAR或WAR文件中,也不会在项目的运行时类路径中。

system: 在 system 范围内定义的依赖项类似于 provided 范围,但你需要通过 systemPath 指定依赖项的路径。这在某些情况下可以用于引入本地系统上不存在于Maven仓库中的库。

import: import 范围主要用于在多模块项目中,用于从父模块中继承依赖。它本身不会影响依赖的传递,仅用于继承。

maven如何解决依赖冲突

版本决议: 当项目中存在多个依赖项,并且这些依赖项具有不同的版本,Maven会尝试选择一个合适的版本来解决冲突。通常情况下,Maven会选择最近的版本,但也会考虑其他因素,如依赖的传递性等。

最短路径优先: 当存在多条依赖路径时,Maven会优先选择最短的路径来解决冲突。这有助于减少依赖层次,提高构建性能和可维护性。

依赖范围: 不同的依赖范围在解决依赖冲突时也起着重要作用。Maven会根据依赖范围的不同,选择合适的依赖版本。例如,compile范围的依赖在编译、运行和测试阶段都会被包含,而test范围的依赖只在测试阶段可用。

Exclusion(排除依赖项): 通过在 pom.xml 中明确地排除某个依赖的版本,可以防止其被引入到项目中,从而避免冲突。这在某些情况下可能是必要的,但应谨慎使用,以免导致其他问题。

Dependency Management(依赖管理): 在父模块中定义的依赖管理部分可以统一指定依赖项的版本,确保所有子模块使用相同的版本。这有助于减少冲突。

插件冲突解决: 有时候项目中的插件可能产生冲突。Maven会根据插件的优先级和版本来解决这些冲突,确保插件能够正确执行。

模块化管理

spring Boot项目可能会被拆分为多个模块,每个模块有其自己的代码和依赖。Maven可以通过多模块项目来管理这些子模块,使得项目结构更加清晰,并能够在模块之间进行依赖管理。

Maven中的子父依赖关系是一种组织项目结构并管理依赖的方式,用于管理多模块项目的依赖和共享配置。这种关系通过创建一个或多个模块作为子模块,其中一个模块作为父模块来实现。

父模块: 父模块是一个包含子模块的项目模块,它的主要作用是提供共享的配置信息,如插件配置、依赖管理和属性。通常父模块本身没有实际的代码或资源。

子模块: 子模块是父模块下的实际项目模块,它可以是一个独立的Java项目、Web应用程序等。每个子模块都有自己的源代码、资源和依赖。

继承和覆盖: 子模块继承父模块的配置信息,这包括插件版本、属性、依赖管理等。子模块可以选择性地覆盖父模块的配置,以满足自己的需求。

依赖管理: 父模块通常会定义一个统一的依赖管理部分,子模块可以从中继承依赖配置。这样可以确保项目中使用相同版本的依赖,减少冲突和混乱。

模块之间的依赖: 子模块之间可以建立依赖关系,这些依赖关系会在构建时自动解析。这样可以将大型项目拆分成更小的模块,使得项目结构更清晰。

你可能感兴趣的:(java-ee,springboot)