在这里,举出这个标题,自然大家知道
Maven
是干啥的,就不过多进行赘述!我们主要对于Maven
的八大核心概念做一个解释补充,这也是我自己的一个学习历程,我们一起共勉!
如果说到Maven
的三大核心概念,那就是
POM(项目对象模型):
仓库:
生命周期:
当然,我们这里说得仔细一点,我们说到Maven
的八大核心概念。
提到的 Maven
的八个核心概念,这包括:
POM(Project Object Model,项目对象模型)是 Maven 中的核心概念之一,它是描述 Maven 项目的基本信息和配置的 XML 文件。以下是 POM 的一些重要方面:
XML 文件: POM 是以 XML 格式编写的文件,通常命名为 pom.xml
,位于项目的根目录下。该文件定义了项目的配置、依赖关系、插件、构建目标等信息。
项目坐标: POM 包含了项目的坐标信息,用于唯一标识一个项目。坐标信息包括 groupId
、artifactId
和 version
。例如:
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0</version>
在 Maven 中,<groupId>
、<artifactId>
和 <version>
是 POM 文件中定义的三个关键元素,它们一起构成了一个 Maven 项目的坐标,用于唯一标识和定位项目。以下是它们的含义:
<groupId>
(项目组标识):
groupId
定义了项目所属的组织或者项目组。通常,它采用逆域名的形式来保证唯一性。例如,com.example
是一个常见的 groupId
。在实际应用中,这个值是用来标识组织或公司,确保组织内部的项目具有唯一的标识。<artifactId>
(项目唯一标识):
artifactId
定义了项目的唯一标识符。它是该项目在特定组织或公司中的唯一名称。例如,my-project
是一个项目的 artifactId
。这个值通常用来描述项目的名称、模块或者组件,确保在同一 groupId
下唯一。<version>
(项目版本号):
version
定义了项目的版本号。它表示项目当前的版本。版本号通常采用 Semantic Versioning(语义化版本)规范,包括主版本号、次版本号和修订号。例如,1.0.0
表示主版本号为 1、次版本号为 0、修订号为 0。版本号的设定遵循一定的规范,使得开发者能够清晰地了解项目的变化和向后兼容性。综合起来,<groupId>
、<artifactId>
和 <version>
三者一起构成了 Maven 项目的坐标,用于唯一标识和定位项目的特定版本。这个坐标对于 Maven 的依赖管理和构建过程非常重要,确保了项目的唯一性和可重复性。
依赖管理: POM 中定义了项目的依赖关系,包括需要的外部库或模块。这些依赖项通常包括坐标信息、版本号等。Maven 使用这些信息来自动下载并添加所需的 JAR 文件到项目的类路径。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.0</version>
</dependency>
<!-- 其他依赖项 -->
</dependencies>
构建插件和目标: POM 中定义了项目的构建过程,包括使用哪些插件,以及这些插件在构建过程中执行的目标。例如,maven-compiler-plugin
用于编译 Java 代码:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 其他插件 -->
</plugins>
</build>
生命周期和阶段: POM 中定义了 Maven 的生命周期和生命周期阶段。生命周期是构建过程的整体步骤,而阶段是生命周期的具体步骤。Maven 生命周期包括 clean
、default
(或 build
)、site
等。
<build>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<versionRange>[3.8.0,)</versionRange>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</build>
总体而言,POM 是 Maven 项目的核心配置文件,它定义了项目的基本信息、构建过程、依赖关系等,使得 Maven 能够自动化构建过程和管理项目的依赖。
Maven 的构建生命周期是一系列阶段(phases)的集合,它定义了 Maven 在构建项目时所执行的一系列步骤。构建生命周期由 Maven 固定定义,涵盖了项目的不同阶段,从清理(cleaning)到编译(compiling)再到部署(deploying)。每个生命周期包含一系列预定义的阶段,而每个阶段则包含了具体的任务(goals)。在 Maven 中,生命周期和阶段是紧密相关的概念。
以下是 Maven 的三个主要构建生命周期:
clean
生命周期:
pre-clean
: 执行一些清理前的准备工作。clean
: 删除 target 目录中生成的文件。default
生命周期(或称 build
生命周期):
validate
: 验证项目是否正确,所有必需信息是否可用。compile
: 编译项目的源代码。test
: 使用适当的单元测试框架测试已编译的源代码。package
: 将编译的代码打包成可发布的格式,如 JAR。verify
: 运行集成测试来验证打包的正确性。install
: 将打包的项目安装到本地仓库,供其他项目使用。deploy
: 将打包的项目复制到远程仓库,以共享给其他开发者和项目。site
生命周期:
pre-site
: 执行一些在生成站点之前的准备工作。site
: 生成项目站点的文档。post-site
: 执行一些在生成站点之后的工作,如部署站点到服务器上。site-deploy
: 将站点发布到服务器上。这些生命周期和阶段使 Maven 能够按照标准的构建流程执行各种任务,从而简化了项目构建和管理的过程。在构建项目时,你可以选择执行整个生命周期,也可以选择执行其中的某个或某些阶段。例如,执行 mvn clean install
命令将触发 clean
和 install
阶段的执行。
Maven 插件(Plugins)是一种可扩展的工具,用于扩展或修改 Maven 构建过程的功能。插件可以用于执行各种任务,例如编译源代码、运行测试、打包项目、生成文档等。Maven 本身提供了一些默认的插件,同时也允许开发者编写自定义插件以满足特定项目的需求。
以下是关于 Maven 插件的一些详细信息:
内建插件(Built-in Plugins):
maven-compiler-plugin
用于编译 Java 代码,maven-surefire-plugin
用于执行单元测试,maven-jar-plugin
用于创建 JAR 文件等。这些插件通常在 Maven 的生命周期阶段中被调用,执行与构建相关的任务。插件配置(Plugin Configuration):
<build>
元素中的 <plugins>
元素来配置。在插件配置中,可以指定插件的坐标、版本、以及插件执行的目标等。例如:<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 其他插件 -->
</plugins>
</build>
插件目标(Plugin Goals):
maven-compiler-plugin
的目标包括 compile
和 testCompile
。在 POM 文件中,可以通过 <executions>
元素配置插件目标的执行。例如:<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 其他插件 -->
</plugins>
</build>
插件生命周期绑定(Plugin Lifecycle Binding):
maven-compiler-plugin
通常与 compile
阶段绑定,而 maven-surefire-plugin
与 test
阶段绑定。这种绑定使得插件在构建生命周期中自动执行。自定义插件(Custom Plugins):
总体而言,Maven 插件是构建过程中关键的组成部分,通过它们,开发者能够扩展 Maven 的功能,定制化项目的构建流程。插件的使用和配置在 Maven 中是非常常见且重要的操作。
Maven 的目标(Goals)是插件的具体任务或操作。每个插件都定义了一组目标,而这些目标表示了插件在构建生命周期中可以执行的具体工作。通过执行 Maven 命令时指定插件的目标,你可以触发插件执行相应的任务。
Maven 插件的目标通常是插件功能的细粒度表达。例如,maven-compiler-plugin
插件定义了 compile
目标,用于编译项目的源代码;maven-surefire-plugin
插件定义了 test
目标,用于执行项目的单元测试。
在 Maven 中,可以通过以下方式执行插件的目标:
mvn plugin:goal
其中,plugin
是插件的名称,goal
是插件的目标。例如,要编译项目,可以运行:
mvn compile
这里的 compile
就是 maven-compiler-plugin
插件的一个目标。
有时候,插件目标也可以通过插件的完整坐标来指定,例如:
mvn org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile
这里的 org.apache.maven.plugins:maven-compiler-plugin:3.8.0
是插件的坐标,compile
是插件的目标。
总体而言,Maven 的目标是插件提供的功能的具体实现,通过执行插件的目标,你可以在构建过程中执行特定的任务。
Maven 仓库(Repository)是用来存储和管理项目构建所需的依赖项(dependencies)、插件(plugins)和其他构建相关的文件的地方。Maven 仓库有两种主要类型:本地仓库(Local Repository)和远程仓库(Remote Repository)。
本地仓库(Local Repository):
.m2/repository
。远程仓库(Remote Repository):
Maven 仓库的主要作用包括:
依赖项管理: Maven 仓库存储项目所需的依赖项,这些依赖项通常是第三方库或其他项目的构建产物。Maven 在构建过程中会检查本地仓库和远程仓库,确保所需的依赖项可用。
插件管理: Maven 插件也是存储在仓库中的构建产物。插件可以用于执行各种构建任务,例如编译、测试、打包等。Maven 在构建时会自动下载并使用相应的插件。
构建产物发布: 开发者可以将自己的构建产物(例如 JAR 文件)发布到远程仓库,以便其他开发者或项目可以访问和使用这些构建产物。
Maven Central Repository 是 Maven 社区维护的一个全球性的公共仓库,包含了大量常用的 Java 构件和插件。除了 Maven Central Repository,开发者还可以使用其他公共的远程仓库,或者搭建私有的仓库来管理项目的依赖项和插件。
在 Maven 的 POM 文件中,可以通过 <repositories>
元素指定项目使用的远程仓库。例如:
<repositories>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
<!-- 其他远程仓库 -->
</repositories>
这里的 <repository>
元素指定了一个远程仓库,其中 id
是仓库的唯一标识,url
是仓库的地址。
在 Maven 中,依赖(Dependencies)是指项目构建所需的外部库、模块或者其他项目的组件。这些依赖项可以包括 Java 类库、框架、插件等,它们由项目的开发者声明,并由 Maven 负责管理。使用依赖可以方便地引入第三方库,提高代码的复用性,并简化项目的构建和维护。
以下是有关 Maven 依赖的详细信息:
声明依赖:
<dependencies>
元素可以声明项目所依赖的库和模块。每个 <dependency>
元素包含了依赖的坐标信息,例如 groupId
(组ID)、artifactId
(项目ID)、version
(版本号)等。示例:<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- 其他依赖项 -->
</dependencies>
坐标信息:
groupId
、artifactId
、version
)唯一标识一个依赖项。其中,groupId
表示组织或者公司,artifactId
表示项目或者模块,version
表示版本号。这三个信息组成了 Maven 依赖的唯一标识。依赖范围(Scope):
compile
: 默认范围,表示依赖项在编译、测试和运行时都可用。test
: 表示依赖项仅在测试阶段可用。provided
: 表示依赖项由运行时环境(如 Servlet 容器)提供,不需要包含在项目的打包文件中。runtime
: 表示依赖项在运行时可用,但在编译时不需要。示例:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
传递性依赖:
依赖排除(Exclusion):
<exclusions>
元素在依赖项中指定不需要的传递性依赖。示例:<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.0</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
总体而言,Maven 依赖是项目构建过程中必不可少的一部分,它使得项目可以轻松地引入和管理第三方库,降低了项目的维护成本。
在 Maven 中,“Coordinates”(坐标)是指用于唯一标识一个构件(artifact)的一组值。这组值通常包括 groupId
(组ID)、artifactId
(项目ID)、version
(版本号),有时还包括其他元素如 classifier
(分类器)和 packaging
(打包方式)。
让我们详细了解 Maven 坐标的各个组成部分:
groupId
(组ID):
groupId
用于标识构建的组织或公司。通常,它采用逆域名(reverse domain)的形式,确保在全球范围内具有唯一性。例如,org.apache.maven.plugins
是 Maven 插件组的 groupId
。artifactId
(项目ID):
artifactId
是指构建产物的项目或模块的唯一标识符。它代表了一个具体的构建单元,例如一个 JAR 文件。通常,它是与项目的名称相对应的短字符串。例如,maven-compiler-plugin
是 Maven 编译插件的 artifactId
。version
(版本号):
version
表示构建产物的版本号。版本号是构建的唯一标识,通常遵循 Semantic Versioning(语义化版本)规范,包括主版本号、次版本号和修订号。例如,2.1.0
是一个版本号。classifier
(分类器):
classifier
是可选的元素,用于在同一 groupId
、artifactId
和 version
的构建产物中进行额外的分类。例如,如果有两个相同版本的 JAR 文件,一个是包含源代码的,另一个是不包含源代码的,可以使用 classifier
区分它们,如 sources
。<dependency>
<groupId>com.example</groupId>
<artifactId>my-library</artifactId>
<version>1.0.0</version>
<classifier>sources</classifier>
</dependency>
packaging
(打包方式):
packaging
描述了构建产物的打包方式。Maven 默认使用 JAR 打包方式,但可以根据项目的性质选择其他打包方式,例如 war
(Web 应用程序归档)或 pom
(用于聚合子模块的项目描述文件)。<packaging>jar</packaging>
综合起来,Maven 坐标是用于唯一标识构建产物的一组元素,使得 Maven 能够准确地定位并下载所需的依赖项。这些坐标信息通常包含在项目的 POM 文件中,并且是 Maven 构建和依赖管理的核心。
在 Maven 中,SNAPSHOT
版本是一种特殊的版本标识,用于表示正在开发中的项目或模块的不稳定、动态版本。SNAPSHOT
版本允许开发者在项目的每次构建中都能获取到最新的构建产物,而不必每次都手动更新版本号。
以下是关于 SNAPSHOT
版本的详细信息:
版本号格式:
SNAPSHOT
版本号是在普通版本号的基础上添加 -SNAPSHOT
后缀。例如,1.0.0-SNAPSHOT
表示一个 SNAPSHOT
版本。动态更新:
SNAPSHOT
版本时,Maven 会在每次构建时检查远程仓库,以查看是否有新的 SNAPSHOT
版本可用。如果有新的构建产物,Maven 将下载并使用最新的 SNAPSHOT
版本,从而确保开发者获得最新的功能和修复。版本决议:
SNAPSHOT
版本,Maven 会首先尝试从远程仓库下载,即使本地仓库已经存在旧版本。这样确保了每次构建都能获取到最新的 SNAPSHOT
版本。用途:
SNAPSHOT
版本通常用于正在积极开发和测试中的项目。开发者可以使用 SNAPSHOT
版本迅速获取最新的更改,同时,这种版本也允许开发者共享尚未正式发布的构建产物。版本发布:
SNAPSHOT
版本发布为正式版本。发布时,Maven 会自动去除 -SNAPSHOT
后缀,生成一个常规的版本号。例如,从 1.0.0-SNAPSHOT
发布为 1.0.0
。<!-- 在 POM 文件中声明 SNAPSHOT 版本 -->
<version>1.0.0-SNAPSHOT</version>
# 发布时,Maven 会去除 -SNAPSHOT 后缀
mvn release:prepare release:perform
总体而言,SNAPSHOT
版本是 Maven 提供的一种便捷机制,用于在开发过程中方便地获取最新的构建产物,同时保留了正式版本的语义化版本号规范。