文章目录
1. 第一章 Maven简介
1.1、Maven概述
Maven 是一个流行的开源构建自动化工具,主要用于 Java 项目,但也可以用于其他语言的项目。它由 Apache 软件基金会开发和维护,旨在简化和标准化项目构建过程。Maven 提供了一个全面的构建生命周期管理,包括编译、测试、打包、部署和文档生成等任务。
1.2 Maven 的主要特点:
(1)项目对象模型(POM):
Maven 使用一个名为 pom.xml 的文件来描述项目的配置和依赖关系。POM(Project Object Model)文件包含项目的基本信息,如项目的名称、版本、依赖、插件和构建配置。
(2)依赖管理:
Maven 可以自动下载和管理项目所需的库和依赖项。通过在 pom.xml 文件中定义依赖项,Maven 会从中央仓库或自定义仓库中下载相关的 JAR 文件,并将其添加到构建路径中。
(3)生命周期管理:
Maven 定义了一系列标准的构建生命周期,包括 compile(编译源代码)、test(运行测试)、package(打包应用程序)、install(将构建的包安装到本地仓库)和 deploy(将构建的包部署到远程仓库)等。每个生命周期由一系列的阶段组成,Maven 根据这些阶段自动执行任务。
(4)插件架构:
Maven 的功能通过插件扩展。插件可以执行特定的任务,如编译代码、运行单元测试、创建 JAR 文件等。Maven 提供了许多内置插件,也允许用户自定义插件或使用第三方插件。
(5)仓库管理:
Maven 使用本地和远程仓库来存储和获取项目的依赖项。项目可以从中央 Maven 仓库(如 Maven Central Repository)下载依赖项,也可以配置私有仓库来存储公司内部的构建工件。
(6)项目结构标准化:
Maven 强调约定优于配置,推荐了一个标准的项目结构,这样开发人员可以快速理解和上手新的项目。标准的目录结构包括 src/main/java(主代码)、src/test/java(测试代码)、src/main/resources(资源文件)等。
1.3、Maven官网
Maven官方网址:https://maven.apache.org/
Maven依赖搜索:https://mvnrepository.com/
1.4、Maven下载
下载地址:https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip
1.5、Maven安装
下载完毕,右键解压,例如我解压完成以后的目录路径如下:C:\DevTools\apache-maven-3.3.9
1.6、Maven环境配置
新建一个系统环境变量:
变量名:MAVEN_HOME
变量值:C:\DevTools\apache-maven-3.3.9
编辑Path系统环境变量:
新增行:%MAVEN_HOME%\bin
1.7、Maven测试安装
按下 windows键 + R键,输入 cmd ,在弹出的命令行窗口中,输入 mvn -v 能够正确输出版本信息,则证明mvn安装成功。
2. Maven项目结构
Maven 项目结构遵循约定优于配置的原则,标准化了项目的布局,使得 Maven 项目易于理解和维护。以下是 Maven 项目的标准目录结构及其常见用途:
my-app/
│
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── App.java
│ │ ├── resources/
│ │ │ └── config.properties
│ │ ├── webapp/
│ │ │ └── WEB-INF/
│ │ │ └── web.xml
│ ├── test/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── AppTest.java
│ │ ├── resources/
│ │ │ └── test-config.properties
│
├── target/
│ ├── classes/
│ │ └── com/
│ │ └── example/
│ │ └── App.class
│ ├── test-classes/
│ │ └── com/
│ │ └── example/
│ │ └── AppTest.class
│ ├── my-app-1.0-SNAPSHOT.jar
│ └── ...
├── .gitignore
├── pom.xml
└── README.md
- src/:源代码目录。
main/:用于存放生产代码和资源。 java/:Java 源代码文件的目录。根据 Java 包结构创建子目录。
resources/:存放与代码一起打包的资源文件,如配置文件、图片等。这些资源会被包含在最终的 JAR 文件中。 webapp/:用于存放
Web 应用相关的资源和文件,通常用于 Web 项目。包括 HTML、JSP、Servlet 配置文件(WEB-INF/web.xml)等。
- test/:用于存放测试代码和资源。
java/:Java 测试代码的目录,结构与 src/main/java 相同。 resources/:测试资源文件,如测试配置文件。
- target/:构建输出目录。Maven 构建过程的输出文件,如编译后的类文件、打包后的 JAR 文件等,会存放在这个目录下。
classes/:编译后的生产代码类文件。 test-classes/:编译后的测试代码类文件。
my-app-1.0-SNAPSHOT.jar:构建生成的 JAR 文件。
.gitignore:Git 忽略文件,指定哪些文件和目录不应被 Git 版本控制。
pom.xml:Maven 项目的核心配置文件,包含了项目的依赖、插件、构建配置等。
README.md:项目的说明文件,通常包含项目的介绍、使用方法、安装步骤等。
常见的变体和额外目录
docs/:有时用于存放项目的文档文件。
scripts/:可能用于存放各种脚本文件,如构建脚本、部署脚本等。
找到 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一般为公司或者组织域名的反写 -->
<groupId>com.caochenlei</groupId>
<!-- artifactId一般为当前项目或者模块的名称 -->
<artifactId>maven-demo</artifactId>
<!-- version代表当前项目或者模块的版本号 -->
<version>0.0.1-SNAPSHOT</version>
</project>
2. 详解POM文件
pom.xml 是 Maven 构建工具的核心配置文件,代表了项目的“项目对象模型”(Project Object Model)。它定义了项目的依赖关系、插件、构建配置等,决定了 Maven 如何构建和管理项目。下面是一个典型的 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/POM/4.0.0/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 App</name>
<description>A simple Maven project</description>
<!-- 项目的依赖项 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.8</version>
</dependency>
<!-- 更多依赖项 -->
</dependencies>
<!-- 构建配置 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 更多插件 -->
</plugins>
</build>
<!-- 配置项目的仓库 -->
<repositories>
<repository>
<id>central</id>
<url>https://repo1.maven.org/maven2</url>
</repository>
<!-- 更多仓库 -->
</repositories>
<!-- 配置插件仓库 -->
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>https://repo1.maven.org/maven2</url>
</pluginRepository>
<!-- 更多插件仓库 -->
</pluginRepositories>
</project>
主要元素解释
<project>
:这是 POM 文件的根元素,包含所有其他元素。
<modelVersion>
:指定 POM 的版本。当前版本为 4.0.0。
<groupId>
:项目的组织标识符。通常使用反向域名(例如 com.example)。
<artifactId>
:项目的唯一标识符。通常是项目的名称(例如 my-app)。
<version>
:项目的版本号(例如 1.0-SNAPSHOT)。
<packaging>
:项目的打包类型(例如 jar、war、pom)。默认值为 jar。
<name>
:项目的名称,用于显示目的。
<description>
:项目的简要描述。
<dependencies>
:列出项目的所有依赖项。每个依赖项由 元素定义,包括 groupId、artifactId 和 version。
<build>
:配置构建过程的插件和其他相关设置。常见的插件包括 maven-compiler-plugin(用于编译代码)和 maven-surefire-plugin(用于运行测试)。
<repositories>
:定义 Maven 用于下载依赖项的远程仓库。Maven 默认使用中央仓库,但可以添加其他仓库。
<pluginRepositories>
:定义用于下载插件的远程仓库。
<properties>
(可选):用于定义项目中使用的属性值。例如,可以设置 Java 版本:
3. Maven依赖管理
Maven 的依赖管理是其核心功能之一,旨在简化和自动化项目所需库的管理过程。通过 Maven,开发者可以声明项目的依赖项,Maven 会自动处理这些依赖,包括下载、更新和解决依赖冲突。以下是 Maven 依赖管理的主要概念和功能:\
3.1 依赖声明
在 Maven 项目中,所有的依赖项都在 pom.xml 文件中的 部分声明。每个依赖项由一个 元素定义,通常包括以下几个部分:
<groupId>
:依赖项的组织标识符(如 org.springframework)。
<artifactId>
:依赖项的唯一标识符(如 spring-core)。
<version>
:依赖项的版本号(如 5.3.8)。
<scope>
(可选):依赖项的作用范围(如 compile、test、provided、runtime)。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
3.2 依赖范围(Scope)
Maven 允许为依赖项指定作用范围,这会影响它们在项目生命周期中的可用性。常见的范围包括:
- compile(默认):编译、运行和测试时都可用。
- provided:编译和测试时可用,但不会包含在最终的 JAR 文件中。通常用于容器或服务器提供的库(如 Servlet API)。
- runtime:运行时可用,但不在编译时需要。例如 JDBC 驱动。
- test:仅在测试时可用,不包括在最终的 JAR 文件中。
- system:系统范围的依赖,通常需要指定系统路径。很少使用,一般不推荐。
3.3 依赖的传递性(Transitive Dependencies)
Maven 会自动处理依赖的传递性。即,如果 A 依赖于 B,而 B 又依赖于 C,Maven 会自动下载 C 并将其添加到项目的类路径中。这有助于简化依赖管理,但有时可能会引发依赖冲突。
3.4 依赖冲突解决
在项目中,如果不同的依赖项需要不同版本的同一库,Maven 会根据“最近优先原则”解决冲突,即优先使用版本较高的依赖。你可以通过 元素来集中管理和统一版本。
3.5 自定义仓库
Maven 默认从中央仓库下载依赖,但你也可以配置其他仓库,如公司内部的私有仓库或镜像。可以在 pom.xml
中使用 和 元素来添加自定义仓库。
<repositories>
<repository>
<id>my-repo</id>
<url>http://repository.mycompany.com/maven2</url>
</repository>
</repositories>
3.6 依赖插件
Maven 插件也可以依赖其他插件,这些插件的配置可以在 pom.xml 文件中的 部分的 元素中进行。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
3.7 更换仓库
为了解决这些不稳定的情况,国内很多知名的大公司,比如:阿里,它们就自己创建了一个仓库,相当是把 maven 中央仓库里边所有的依赖全部拷到了他们自己的仓库中,并实时更新,同时,向国人也开放了这个仓库的地址,也就是 阿里的maven库 。
现在,maven 默认是从中央仓库去下载,我们想要改变它,就必须告诉他,说你不要去找中央仓库了,太慢了,你去阿里的maven库下载吧,既然要告诉他,我们就需要配置一下远程仓库地址。
找到解压后的maven目录,进入 conf 目录,找到 settings 文件,在里边找到 mirrors 节点,替换成以下信息:
例如我的是在: C:\DevTools\apache-maven-3.3.9\conf\settings.xml ,强烈建议使用 VSCode 编辑器打开,它会高亮文字。
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
同时,因为 maven 默认使用的JDK编译版本为JDK1.5,显然也并不符合我们的要求。
我们需要重新指定版本,只需要找到 profiles 节点,替换成以下信息即可:
<profiles>
<profile>
<id>jdk1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
4. Maven常用命令
mvn clean
说明:删除之前的构建结果,包括编译生成的文件和 JAR 文件。通常与 install 或 package 命令一起使用,确保构建的干净状态。
mvn compile
说明:编译 src/main/java 目录下的 Java 源代码,并将编译后的类文件放在 target/classes 目录下。
mvn test
说明:编译并执行 src/test/java 目录下的单元测试,测试结果会输出到 target/test-classes 目录。
mvn package
说明:编译源代码、执行测试并将项目打包到 JAR 文件(或其他类型的打包文件,如 WAR 文件),生成的文件会放在 target 目录下。
mvn install
说明:编译、测试、打包项目,并将生成的 JAR 文件安装到本地 Maven 仓库 (~/.m2/repository),使得其他项目可以引用。
mvn deploy
说明:在成功构建和测试项目后,将生成的构建结果上传到配置的远程仓库,通常用于发布版本。
mvn validate
说明:检查项目的配置和环境是否正确,通常在构建过程中是第一个执行的阶段。
mvn site
根据项目的 POM 文件和源代码生成 HTML 格式的项目文档,包括项目的依赖、插件和报告等信息。生成的文档会放在 target/site 目录下。
. mvn dependency:tree
说明:显示项目及其所有依赖项的层次结构,有助于了解项目的依赖关系和解决冲突。
mvn help:effective-pom
说明:显示合并后的有效 POM 文件,包括所有继承的和继承过来的设置,有助于调试配置问题。
mvn clean install -DskipTests
说明:跳过测试阶段,只进行编译、打包和安装,适用于快速构建测试。
mvn exec:java -Dexec.mainClass="com.example.Main"
说明:使用 Maven Exec 插件执行指定的 Java 主类,通常用于运行 Java 程序而不需要打包成 JAR 文件。
5. Maven生命周期
Maven 生命周期是 Maven 构建和管理项目的核心概念。生命周期是一个预定义的阶段序列,每个阶段会执行一系列特定的任务。通过这些阶段,Maven 处理项目的编译、测试、打包、部署等任务。Maven 的生命周期分为以下几个主要类别:
1. 内建生命周期(Default Lifecycle)
validate:验证项目是否正确,并且所有必要的信息都已提供。
compile:编译项目的源代码。
test:运行测试代码(在编译后的代码上)。
package:打包编译后的代码(例如,生成 JAR 文件)。
verify:运行任何额外的检查,确保包质量。
install:将打包的代码安装到本地 Maven 仓库,供其他项目使用。
deploy:将打包的代码发布到远程仓库,使其他开发者和项目能够访问。
2. 清理生命周期(Clean Lifecycle)
pre-clean:在执行清理之前执行的任务。
clean:删除之前生成的文件,如 target 目录。
post-clean:在执行清理之后执行的任务。
3. 站点生命周期(Site Lifecycle)
pre-site:在生成站点文档之前执行的任务。
site:生成项目的站点文档。
post-site:在生成站点文档之后执行的任务。
site-deploy:将生成的站点文档部署到 Web 服务器或其他存储位置。
生命周期的执行
Maven 会根据指定的目标阶段自动执行这些生命周期。例如,运行 mvn install 命令时,Maven 会依次执行 validate、compile、test、package、verify、install 阶段。