【实习学习之旅】Maven架构

Maven核心技术详解

一、Maven简介

        Apache Maven 是一个强大的项目管理和构建自动化工具,主要用于 Java 项目。但它同样适用于 C#、Ruby、Scala 等其他语言的项目。它的核心功能基于 项目对象模型 (Project Object Model, POM) 的概念,通过一个名为 pom.xml 的文件来管理项目的构建、报告和文档。

        您可以把它想象成一个非常智能、全自动的项目管家。你只需要告诉它项目的“蓝图”(pom.xml)和最终想要的产品(例如一个可运行的 JAR 包),它就会自动完成下载库文件、编译代码、运行测试、打包部署等一系列繁琐的工作。

        总的来说,Maven 解决了软件构建的两方面问题:

  • 一是软件是如何构建的。
  • 二是软件的依赖关系。

1.Maven 的主要功能和优势

功能说明
依赖管理自动下载和管理 .jar 文件,避免手动管理依赖
标准化构建流程提供 cleancompiletestpackage 等标准生命周期
项目模板(Archetype)快速生成项目结构(如 maven-archetype-quickstart
多模块支持适用于大型项目,可以拆分为多个子模块
插件扩展支持自定义构建任务(如 maven-compiler-plugin 指定 Java 版本)

优势:

  • 减少配置:约定优于配置,减少 build.xml(Ant)这样的手动配置。

  • 依赖自动管理:只需声明依赖,Maven 自动下载并处理冲突。

  • 跨平台:基于 Java,可在 Windows、Linux、macOS 上运行。

  • 与 IDE 集成:Eclipse、IntelliJ IDEA、VS Code 都支持 Maven。

二、标准项目结构(约定优于配置)

        Maven 强制约定了一个标准的目录结构,这样所有 Maven 项目都长一样,开发者无需配置就能立刻理解任何项目。

my-app(项目名)
├── pom.xml          # 核心配置文件
├── src
│   ├── main         # 主代码目录
│   │   ├── java     # Java 源代码
│   │   └── resources # 资源文件(配置文件、图片等)
│   └── test         # 测试代码目录
│       ├── java     # 测试 Java 源代码
│       └── resources # 测试资源文件
└── target           # 构建输出目录(编译后的类文件、打包的jar等,由maven自动生成)

三、Maven仓库

        在 Maven 的术语中,仓库是一个位置(place)。Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。

        Maven 仓库能帮助我们管理构件(主要是 JAR),它就是放置所有 JAR 文件(WAR,ZIP,POM 等等)的地方。

Maven 仓库类型:

仓库类型存储位置作用
本地仓库默认用户目录下的.m2/repository缓存远程下载的依赖
远程仓库网络服务器提供依赖和插件的集中存储
- 中央仓库repo.maven.apache.orgMaven官方维护的默认仓库
- 私服仓库公司内部搭建(如Nexus)托管私有依赖,加速构建
- 其他公共仓库如阿里云、JCenter等镜像或补充中央仓库

1.本地仓库

        Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。

        运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

2.中央仓库

        Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。

        中央仓库包含了绝大多数流行的开源 Java 构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的 Java 项目依赖的构件都可以在这里下载到。

3.私服仓库

        公司内部通常会搭建私服(如 Nexus, Artifactory),作为远程仓库的代理和缓存,加速下载并存放公司内部的私有组件。

4.Maven 阿里云(Aliyun)仓库

        Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。

工作流程:当你在项目中声明一个依赖时,Maven 会按以下顺序查找:

  1. 本地仓库

  2. → 私服(如果配置了)

  3. → 中央仓库(或其他配置的公共仓库)

四、setting.xml

        Maven 的 settings.xml 是其全局配置文件,用来定制 Maven 的行为,比如设置本地仓库位置、配置远程仓库镜像、管理认证信息等。它与项目级别的 pom.xml 协作,但关注的是构建环境本身及用户特定的设置。

1.settings.xml 的位置与优先级

settings.xml 文件通常存在于两个位置:

  1. 全局配置:位于 Maven 安装目录的 conf 文件夹下(如 $M2_HOME/conf/settings.xml)。此处的配置对本机所有使用该 Maven 的用户都生效

  2. 用户配置:位于用户目录下的 .m2 文件夹中(如 ~/.m2/settings.xml)。此处的配置仅对当前用户生效,并且优先级高于全局配置。

        如果两个文件同时存在,配置内容会被合并,但冲突时用户配置会覆盖全局配置。Maven 实际的配置优先级从高到低是:
pom.xml > 用户 settings (~/.m2/settings.xml) > 全局 settings ($M2_HOME/conf/settings.xml)

2.settings.xml元素详解

2.1 根标签 <settings>

        整个配置文件的根节点,定义了 Maven 配置的命名空间和 XML schema 约束,确保配置格式的合法性。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                              https://maven.apache.org/xsd/settings-1.0.0.xsd">

</settings>

2.2 localRepository

        指定本地仓库的路径,Maven 在此存储下载的依赖。未设置时默认为 ~/.m2/repository

<localRepository>D:\Java\Javaweb\develop\apache-maven-3.6.1\mvn-repo</localRepository>

2.3 <mirrors> 与 <mirror>:镜像配置

        用于定义远程仓库的镜像,加速依赖下载或指定私有仓库。

<mirror>
    <!-- 该镜像的唯一标识符。id 用来区分不同的 mirror 元素。 -->
    <id>alimaven</id>
    <!-- 镜像作用范围 -->
    <mirrorOf>central</mirrorOf>
    <!-- 镜像名称 -->
    <name>aliyun maven</name>
    <!-- 该镜像的 URL。构建系统会优先考虑使用该 URL,而非使用默认的服务器 URL。 -->
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>

2.4 <servers> 与 <server>:仓库认证配置

        用于存储需要权限验证的仓库的账号密码,避免在 pom.xml 中明文暴露敏感信息。当 Maven 访问 id 匹配的仓库时,会自动使用这里的账号密码进行身份验证。

<servers>
  <server>
    <id>maven-public</id>          <!-- 仓库唯一标识(需与仓库配置中的 id 一致) -->
    <username>admin</username>     <!-- 登录用户名 -->
    <password>1234</password>  <!-- 登录密码 -->
  </server>
  <!-- 其他 server 配置类似,对应不同仓库的认证 -->
</servers>

2.5 <profiles> 与 <profile>:环境配置集

        用于定义一组可切换的配置(如仓库、JDK 版本等),可通过激活指定 profile 生效。

<profiles>
<profile>
  <id>nexus</id>  <!-- profile 唯一标识 -->
  <repositories>  <!-- 项目依赖仓库配置 -->
    <repository>
      <id>maven-public</id>  <!-- 仓库标识(需与 servers 中 server 的 id 对应) -->
      <url>http://192.168.101.206:8080/repository/maven-public/</url>  <!-- 仓库地址(企业私服) -->
      <releases><enabled>true</enabled></releases>  <!-- 允许下载正式版依赖 -->
      <snapshots><enabled>true</enabled></snapshots>  <!-- 允许下载快照版依赖 -->
    </repository>
    <!-- 其他仓库配置类似  -->
  </repositories>
  
  <pluginRepositories>  <!-- 插件仓库配置(Maven 插件的下载地址) -->
    <!-- 配置逻辑与 repositories 一致,用于指定插件的下载来源 -->
  </pluginRepositories>
</profile>
</profiles>

2.6 <activeProfiles>:激活 profiles        

        指定哪些 profile 生效(可以同时激活多个)。

<activeProfiles>
  <activeProfile>nexus</activeProfile>       <!-- 激活企业私服配置 -->
  <activeProfile>edas.oss.repo</activeProfile>  <!-- 激活阿里云 EDAS 仓库配置 -->
</activeProfiles>

五、Maven生命周期

        Maven的生命周期就是对所有的构建过程进行统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署等几乎所有的构建步骤。

Maven 构建生命周期定义了一个项目构建跟发布的过程,包含三个标准生命周期:

  • clean:清理项目
  • default(或 build):核心构建流程
  • site:生成项目文档

1、Clean 生命周期:

  • clean:删除目标目录中的编译输出文件。这通常是在构建之前执行的,以确保项目从一个干净的状态开始。

2、Default 生命周期(也称为 Build 生命周期):

  • validate:验证项目的正确性,例如检查项目的版本是否正确。
  • compile:编译项目的源代码。
  • test:运行项目的单元测试。
  • package:将编译后的代码打包成可分发的格式,例如 JAR 或 WAR。
  • verify:对项目进行额外的检查以确保质量。
  • install:将项目的构建结果安装到本地 Maven 仓库中,以供其他项目使用。
  • deploy:将项目的构建结果复制到远程仓库,以供其他开发人员或团队使用。

3、Site 生命周期:

  • site:生成项目文档和站点信息。
  • deploy-site:将生成的站点信息发布到远程服务器,以便共享项目文档。

六、Maven 插件

        Maven 插件是扩展 Maven 功能的可执行组件,每个插件包含一个或多个目标(goals),用于执行特定任务(如编译、测试、打包等)。

插件与生命周期的关系:

  • 生命周期(Lifecycle):定义构建阶段(phase)的顺序

  • 插件(Plugin):提供具体实现(goal)来完成这些阶段的任务

        每个生命周期中都包含着一系列的阶段(phase)。这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。

        我们在输入 mvn 命令的时候 比如 mvn clean,clean 对应的就是 Clean 生命周期中的 clean 阶段。但是 clean 的具体操作是由 maven-clean-plugin 来实现的。

        所以说 Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。

七、Maven POM

        POM ( Project Object Model,项目对象模型 ) 是 Maven 的核心配置文件,采用 XML 格式,默认命名为 pom.xml。

        POM 是 Maven 工程的基本工作单元,是一个 XML 文件,它定义了项目的基本信息(groupId, artifactId, version,即坐标)、依赖项、插件、构建规则、父项目、环境设置等。

        所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version。

节点描述
project工程的根标签。
modelVersion模型版本需要设置为 4.0。
groupId这是工程组的标识。它在一个组织或者项目中通常是唯一的。
artifactId这是工程的标识。它通常是工程的名称。
version

这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。

1.POM 文件基本结构

<project>
    <!-- 1. 基础信息 -->
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.hl</groupId>
    <artifactId>app</artifactId>
    <version>1.0.0</version>

    <!-- 2. 元信息 -->
    <name>My Application</name>
    <description>A demo project</description>

    <!-- 3. 依赖管理 -->
    <dependencies>...</dependencies>

    <!-- 4. 构建配置 -->
    <build>...</build>

</project>

2.项目坐标(必须):

元素说明示例
modelVersionPOM 模型版本(固定 4.0.0<modelVersion>4.0.0</modelVersion>
groupId组织/公司标识(反向域名)<groupId>com.example</groupId>
artifactId项目名称<artifactId>my-app</artifactId>
version项目版本<version>1.0.0</version>
packaging打包类型(jar/war/pom<packaging>jar</packaging>

3.元信息(可选):

元素说明
name项目名称(显示用)
description项目描述
url项目主页
licenses许可证信息
organization组织信息

4.依赖管理

POM文件中可以定义项目的依赖:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>
元素说明
groupId依赖的组织标识
artifactId依赖的项目名
version依赖的版本
scope依赖作用域(compile/test/provided/runtime
optional是否可选依赖(默认 false

5.插件管理

POM 文件中也可以定义构建过程中的插件:

<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>

常用插件:

  • maven-compiler-plugin:指定 Java 版本

  • maven-surefire-plugin:控制测试执行

  • maven-jar-plugin:定制 JAR 包

6.其他常用元素

6.1 properties: 定义项目中的一些属性变量。

用于定义变量,避免重复:

<properties>
    <java.version>11</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

在依赖中引用:

<version>${java.version}</version>

6.2 dependencyManagement: 用于管理依赖的版本,特别是在多模块项目中。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.9</version>
        </dependency>
    </dependencies>
</dependencyManagement>

6.3 继承和聚合

继承: 通过 parent 元素,一个POM文件可以继承另一个POM文件的配置:

<parent>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

聚合: 通过 modules 元素,一个 POM 文件可以管理多个子模块:

<modules>
    <module>module1</module>
    <module>module2</module>
</modules>

6.4 repositories: 仓库配置。

指定远程仓库:

<repositories>
    <repository>
        <id>aliyun</id>
        <url>https://maven.aliyun.com/repository/public</url>
    </repository>
</repositories>

八、Maven 引入外部依赖

        如果我们需要引入第三方库文件到项目,该怎么操作呢?pom.xml 的 dependencies 列表列出了我们的项目需要构建的所有外部依赖项。

        要添加依赖项,我们一般是先在 src 文件夹下添加 lib 文件夹,然后将你工程需要的 jar 文件复制到 lib 文件夹下。

<dependencies>
        <dependency>
            <groupId>com.hl</groupId>
            <artifactId>ecp</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/resources/lib/ecp-0.0.1-SNAPSHOT.jar</systemPath>
        </dependency>
</dependencies>
<!-- 用于定义构建后的文件名格式 -->
<build>
   <finalName>ecp-${artifactId}-${version}</finalName>
</build>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤姆大聪明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值