一文搞懂Maven

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
  1. src/:源代码目录。

main/:用于存放生产代码和资源。 java/:Java 源代码文件的目录。根据 Java 包结构创建子目录。
resources/:存放与代码一起打包的资源文件,如配置文件、图片等。这些资源会被包含在最终的 JAR 文件中。 webapp/:用于存放
Web 应用相关的资源和文件,通常用于 Web 项目。包括 HTML、JSP、Servlet 配置文件(WEB-INF/web.xml)等。

  1. test/:用于存放测试代码和资源。

java/:Java 测试代码的目录,结构与 src/main/java 相同。 resources/:测试资源文件,如测试配置文件。

  1. 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 允许为依赖项指定作用范围,这会影响它们在项目生命周期中的可用性。常见的范围包括:

  1. compile(默认):编译、运行和测试时都可用。
  2. provided:编译和测试时可用,但不会包含在最终的 JAR 文件中。通常用于容器或服务器提供的库(如 Servlet API)。
  3. runtime:运行时可用,但不在编译时需要。例如 JDBC 驱动。
  4. test:仅在测试时可用,不包括在最终的 JAR 文件中。
  5. 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 阶段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值