maven系统性知识介绍(简述maven)
我是半路转java开发的,一直都是直接接手别人已经开发好的java项目进行维护,很少从头自己创建一个项目。这样导致我对于maven的理解,特别是pom的配置总是一知半解。
之前一直不觉得有问题,反正开发中碰上问题能解决就行。直到最近因为系统重构需要从0开始写项目,才发现缺失系统性的知识还是会对工作效率有影响。
为弥补,我让豆包给我输出一篇比较系统性介绍maven知识的文章,感觉质量还可以,跟大家分享一下。
Maven完全指南:从核心概念到实战应用的系统梳理
Maven作为Java生态中事实上的项目管理标准,其设计理念和功能体系涵盖了项目构建、依赖管理、生命周期控制等核心场景。本文将从基础概念到进阶实践,系统梳理Maven的完整知识体系,帮助读者建立全局认知,减少知识盲点。
一、Maven核心认知:是什么与为什么
1.1 定义与定位
Maven是一个基于项目对象模型(POM) 的构建工具,通过标准化的配置和约定,解决了"如何构建项目"、"如何管理依赖"、"如何协同多模块"三大核心问题。其核心价值在于:
- 标准化:统一项目结构和构建流程,降低跨项目协作成本
- 自动化:通过生命周期自动执行构建步骤(编译、测试、打包等)
- 可扩展性:通过插件机制支持自定义构建逻辑
1.2 核心理念:约定大于配置(Convention over Configuration)
Maven预设了一套合理的默认规则(约定),开发者无需手动配置即可完成大部分工作。当需要偏离约定时,才需显式配置。例如:
- 源代码默认放在src/main/java(无需配置即可被编译)
- 测试代码默认放在src/test/java(无需配置即可被执行)
- 构建产物默认输出到target/目录
二、Maven核心组件与概念
2.1 项目对象模型(POM)
POM是Maven的核心,所有配置通过pom.xml文件定义,是项目的"元数据描述"。一个完整的POM包含以下核心配置项(附详细注释):
<?xml version="1.0" encoding="UTF-8"?>
<!--
根元素:project
- xmlns:POM命名空间,固定值
- xsi:schemaLocation:POM schema位置,用于验证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">
<!-- 1. 模型版本(必需):固定为4.0.0(Maven 2/3唯一支持的版本) -->
<modelVersion>4.0.0</modelVersion>
<!-- 2. 项目基本标识(GAV坐标,必需):唯一确定一个项目 -->
<groupId>com.example</groupId> <!-- 组织标识:通常为反向域名(如com.company.team) -->
<artifactId>demo-project</artifactId> <!-- 项目标识:项目唯一名称(小写+连字符) -->
<version>1.0.0-SNAPSHOT</version> <!-- 版本号:SNAPSHOT(快照版)/RELEASE(正式版) -->
<!-- 3. 可选基本信息 -->
<name>Demo Project</name> <!-- 项目名称:用于文档和日志显示 -->
<description>A sample Maven project</description> <!-- 项目描述:可选 -->
<url>https://example.com/projects/demo</url> <!-- 项目主页:可选 -->
<inceptionYear>2024</inceptionYear> <!-- 创始年份:用于生成文档,可选 -->
<!-- 4. 打包类型(可选,默认jar) -->
<packaging>jar</packaging> <!-- 可选值:jar/war/pom/ear等,决定构建产物类型 -->
<!-- 5. 父项目配置(可选,用于继承) -->
<parent>
<groupId>com.example</groupId> <!-- 父项目GAV坐标,必需 -->
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<relativePath>../parent/pom.xml</relativePath> <!-- 父POM路径,默认../pom.xml,可选 -->
</parent>
<!-- 6. 属性配置(可选,用于定义可复用变量) -->
<properties>
<java.version>11</java.version> <!-- 自定义属性:通过${java.version}引用 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 内置属性:编码格式 -->
<spring.version>5.3.20</spring.version>
</properties>
<!-- 7. 依赖管理(可选,用于统一版本,不实际引入依赖) -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version> <!-- 引用properties中定义的版本 -->
<scope>compile</scope> <!-- 依赖范围:默认compile,可选 -->
<type>jar</type> <!-- 依赖类型:默认jar,可选 -->
<optional>false</optional> <!-- 是否为可选依赖:默认false,可选 -->
</dependency>
</dependencies>
</dependencyManagement>
<!-- 8. 项目依赖(可选,实际引入的依赖) -->
<dependencies>
<!-- 示例1:引入Spring上下文(版本继承自dependencyManagement) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<!-- 无需指定version,继承自dependencyManagement -->
</dependency>
<!-- 示例2:测试依赖(scope=test) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope> <!-- 仅在测试阶段生效 -->
<exclusions> <!-- 排除传递依赖,可选 -->
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 9. 构建配置(可选,控制构建过程) -->
<build>
<finalName>${project.artifactId}-${project.version}</finalName> <!-- 构建产物名称,可选 -->
<directory>target</directory> <!-- 构建输出目录,默认target,可选 -->
<!-- 源代码目录配置(可选,默认遵循约定) -->
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<!-- 资源文件配置(可选,默认src/main/resources) -->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes> <!-- 包含的文件,可选 -->
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<excludes> <!-- 排除的文件,可选 -->
<exclude>**/*.txt</exclude>
</excludes>
<filtering>true</filtering> <!-- 是否启用变量替换,默认false,可选 -->
</resource>
</resources>
<!-- 插件管理(可选,统一插件版本,不实际绑定) -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version> <!-- 插件版本,必需 -->
<configuration> <!-- 插件配置,可选 -->
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<!-- 插件配置(可选,实际绑定到生命周期的插件) -->
<plugins>
<!-- 编译插件(绑定到compile阶段) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- 版本继承自pluginManagement,无需重复 -->
<executions> <!-- 自定义插件执行逻辑,可选 -->
<execution>
<id>default-compile</id> <!-- 执行ID,唯一 -->
<phase>compile</phase> <!-- 绑定的生命周期阶段 -->
<goals>
<goal>compile</goal> <!-- 插件目标:插件的具体功能 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 10. 分发管理(可选,用于部署到仓库) -->
<distributionManagement>
<repository> <!-- 发布版本仓库 -->
<id>releases</id> <!-- 仓库ID,与settings.xml中的server对应 -->
<url>https://repo.example.com/releases</url>
</repository>
<snapshotRepository> <!-- 快照版本仓库 -->
<id>snapshots</id>
<url>https://repo.example.com/snapshots</url>
</snapshotRepository>
</distributionManagement>
<!-- 11. 开发者信息(可选,用于文档和协作) -->
<developers>
<developer>
<id>dev1</id>
<name>Zhang San</name>
<email>zhangsan@example.com</email>
<roles>
<role>developer</role>
</roles>
</developer>
</developers>
<!-- 12. 组织信息(可选) -->
<organization>
<name>Example Corp</name>
<url>https://example.com</url>
</organization>
<!-- 13. 仓库配置(可选,指定依赖下载源) -->
<repositories>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
<releases>
<enabled>true</enabled> <!-- 是否启用发布版本下载 -->
</releases>
<snapshots>
<enabled>false</enabled> <!-- 是否启用快照版本下载 -->
</snapshots>
</repository>
</repositories>
</project>
2.2 生命周期(Lifecycle)
Maven定义了三套相互独立的生命周期,每套生命周期包含一系列有序的"阶段(Phase)",执行某个阶段时会自动执行其之前的所有阶段。
生命周期 | 核心阶段(按执行顺序) | 作用 |
clean | pre-clean → clean → post-clean | 清理构建产物(如删除target目录) |
default(核心) | validate → compile → test → package → install → deploy | 完成项目构建的核心流程(编译、测试、打包、部署) |
site | pre-site → site → post-site → site-deploy | 生成项目文档(如API文档、报告) |
关键特性:
- 生命周期是"抽象"的,仅定义阶段顺序,不实现具体功能(功能由插件完成)
- 不同生命周期的阶段可组合执行(如mvn clean package:先执行clean生命周期,再执行default到package阶段)
2.3 插件(Plugin)
插件是Maven功能的具体实现者,通过"目标(Goal)"绑定到生命周期的阶段,完成实际工作(如编译、测试)。
核心概念:
- 插件坐标:groupId:artifactId:version(与依赖坐标格式一致)
- 目标(Goal):插件的具体功能单元(如maven-compiler-plugin:compile)
- 绑定:目标与生命周期阶段关联(如compile目标绑定到compile阶段)
插件执行顺序:
- 同阶段内:按POM中插件声明的顺序执行
- 不同阶段:按生命周期阶段的顺序执行(如compile阶段的插件先于test阶段)
常用插件:
插件 | 核心目标 | 作用 |
maven-compiler-plugin | compile、testCompile | 编译Java源代码和测试代码 |
maven-surefire-plugin | test | 执行单元测试(Junit/TestNG) |
maven-jar-plugin | jar | 打包为JAR文件 |
maven-war-plugin | war | 打包为WAR文件 |
maven-install-plugin | install | 将产物安装到本地仓库 |
2.4 依赖管理(Dependency Management)
Maven通过依赖机制自动管理项目所需的外部库,核心概念包括:
依赖范围(Scope):
控制依赖在不同生命周期阶段的可见性,常见范围:
- compile(默认):编译、测试、运行阶段均生效
- test:仅测试阶段生效(如Junit)
- provided:编译和测试阶段生效,运行时由容器提供(如Servlet API)
- runtime:测试和运行阶段生效,编译时不需要(如JDBC驱动)
- system:与provided类似,但需显式指定本地路径(不推荐)
依赖传递与冲突:
- 传递性:A依赖B,B依赖C,则A自动依赖C(可通过<exclusions>排除)
- 冲突解决:
- 最短路径优先:直接依赖优先于传递依赖
- 声明顺序优先:路径长度相同时,POM中先声明的版本生效
2.5 仓库(Repository)
仓库是依赖和插件的存储位置,分为:
- 本地仓库:默认~/.m2/repository,缓存下载的依赖
- 远程仓库:
- 中央仓库(Maven官方,https://repo.maven.apache.org/maven2)
- 私有仓库(如Nexus、Artifactory,用于团队内部共享)
- 第三方仓库(如阿里云镜像,加速国内访问)
仓库优先级:本地仓库 → 配置的远程仓库(按声明顺序)
2.6 原型(Archetype)
原型是项目模板,用于快速生成符合约定的项目结构。
内置原型:
- maven-archetype-quickstart:普通Java项目
- maven-archetype-webapp:Web项目
自定义原型:
可通过以下步骤创建自己的项目模板:
- 创建一个符合需求的项目作为原型模板
- 执行mvn archetype:create-from-project生成原型
- 安装原型到本地仓库:cd target/generated-sources/archetype && mvn install
- 使用自定义原型:mvn archetype:generate -DarchetypeGroupId=...
三、父子项目与多模块管理
3.1 核心概念:
- 父项目:定义公共配置(依赖版本、插件、属性等),子项目通过<parent>继承
- 聚合项目:通过<modules>管理子模块,支持批量构建
- 通常父项目同时承担"继承"和"聚合"角色
- 一个典型的父项目pom如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--
根标签:project
- 作用:所有Maven配置的根节点
- xmlns:XML命名空间,固定值,用于标识这是Maven的POM文件
- xsi:schemaLocation:指定POM的XML Schema位置,用于验证XML格式正确性
- 【继承规则】:整个POM结构会被子项目继承,子项目可通过同名标签覆盖具体配置
-->
<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:模型版本
- 作用:指定POM所遵循的Maven模型版本
- 固定值:4.0.0(Maven 2.x和3.x唯一支持的版本,不可修改)
- 【继承规则】:会被子项目继承,且子项目不可修改(必须与父项目一致)
-->
<modelVersion>4.0.0</modelVersion>
<!--
项目基本标识(GAV坐标):这三个标签组合起来唯一确定一个项目,类似"快递地址+门牌号"
-->
<!--
groupId:组织/公司标识
- 作用:区分不同组织或公司的项目,避免重名
- 命名规范:通常使用反向域名(如公司域名是example.com,则groupId为com.example)
- 必填项,子项目会继承此值
- 【继承规则】:子项目默认继承,若子项目显式声明则覆盖父项目值
-->
<groupId>com.example</groupId>
<!--
artifactId:项目唯一标识
- 作用:在同一组织内区分不同项目
- 命名规范:小写字母+连字符(如parent-project、user-service)
- 必填项,子项目需单独定义自己的artifactId
- 【继承规则】:不会被继承(子项目必须有自己的唯一标识)
-->
<artifactId>parent-project</artifactId>
<!--
version:版本号
- 作用:标识项目的版本,便于版本管理
- 常见格式:
- 快照版:x.y.z-SNAPSHOT(开发中版本,每次构建可能变化)
- 正式版:x.y.z(如1.0.0、2.3.1,发布后不允许修改)
- 必填项,子项目会默认继承此值,也可单独指定
- 【继承规则】:子项目默认继承,显式声明则覆盖(建议父子版本保持一致便于管理)
-->
<version>1.0.0-SNAPSHOT</version>
<!--
packaging:打包类型
- 作用:指定项目的打包方式和构建产物类型
- 父项目必填值:pom(表示这是一个聚合/父项目,不产生代码产物)
- 其他可选值:jar(普通Java项目)、war(Web项目)、ear(企业级应用)等
- 【继承规则】:不会被继承(子项目需根据自身类型声明,如jar或war)
-->
<packaging>pom</packaging>
<!--
name:项目名称
- 作用:给项目起一个易读的名称,用于文档和日志显示
- 可选配置,不影响构建过程
- 【继承规则】:子项目默认继承,显式声明则覆盖
-->
<name>Parent Project</name>
<!--
description:项目描述
- 作用:简要说明项目的用途
- 可选配置,便于团队成员理解项目
- 【继承规则】:子项目默认继承,显式声明则覆盖
-->
<description>Parent project for managing multi-module applications</description>
<!--
modules:模块列表
- 作用:声明当前父项目聚合的子模块(实现多模块批量构建)
- 配置规则:
- 每个<module>标签对应一个子模块的文件夹名称
- 子模块默认必须放在父项目根目录下(如需修改路径,可写相对路径如modules/user-service)
- 父项目作为"聚合项目"的核心配置,执行父项目命令时会自动触发所有子模块的对应命令
- 【继承规则】:不会被继承(子项目可声明自己的modules形成多级结构,但与父项目无关)
-->
<modules>
<module>user-service</module> <!-- 子模块1:用户服务模块 -->
<module>order-service</module> <!-- 子模块2:订单服务模块 -->
<module>common-util</module> <!-- 子模块3:公共工具模块 -->
</modules>
<!--
properties:属性配置
- 作用:定义可复用的变量,通过${变量名}在POM中引用,便于统一维护
- 典型用途:
- 管理依赖版本(如spring.boot.version)
- 配置编码格式(project.build.sourceEncoding)
- 指定JDK版本(maven.compiler.source)
- 【继承规则】:子项目可直接引用父项目属性;若子项目定义同名属性,则覆盖父项目值(就近原则)
-->
<properties>
<!-- JDK版本配置 -->
<maven.compiler.source>11</maven.compiler.source> <!-- 源码编译版本 -->
<maven.compiler.target>11</maven.compiler.target> <!-- 目标运行版本 -->
<!-- 编码格式(推荐固定为UTF-8,避免中文乱码) -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 框架版本管理(集中定义,便于全局升级) -->
<spring.boot.version>2.7.0</spring.boot.version>
<lombok.version>1.18.24</lombok.version>
<junit.version>4.13.2</junit.version>
</properties>
<!--
dependencyManagement:依赖管理
- 作用:集中声明依赖的版本信息,但不会实际引入依赖(类似"购物清单模板")
- 子项目好处:子模块引入依赖时无需指定version,自动使用父项目声明的版本,保证版本统一
- 与dependencies的区别:dependencies会实际引入依赖并传递给子项目,而dependencyManagement仅做版本管理
- 【继承规则】:子项目默认继承版本声明;子项目引入依赖时显式指定version会覆盖父项目;子项目的dependencyManagement会覆盖父项目的同名依赖配置
-->
<dependencyManagement>
<dependencies>
<!-- Spring Boot 核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version> <!-- 引用properties中定义的版本 -->
</dependency>
<!-- Lombok 工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional> <!-- 标记为可选依赖,子项目需显式引入才会生效 -->
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope> <!-- 依赖范围:仅在测试阶段生效 -->
</dependency>
</dependencies>
</dependencyManagement>
<!--
build:构建配置
- 作用:配置项目的构建过程,如插件、输出目录、资源文件等
- 【继承规则】:子项目默认继承,显式声明同名配置会覆盖
-->
<build>
<!--
pluginManagement:插件管理
- 作用:集中声明插件的版本和配置,但不会实际绑定到生命周期(类似依赖管理的插件版)
- 子项目好处:子模块使用插件时无需指定version,自动继承父项目的版本和配置
- 【继承规则】:子项目声明插件时默认使用父项目配置;子项目显式指定插件版本或配置会覆盖父项目
-->
<pluginManagement>
<plugins>
<!-- 编译插件:用于指定JDK编译版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version> <!-- 插件版本 -->
<configuration>
<!-- 引用properties中定义的JDK版本,与前面保持一致 -->
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
<!-- Spring Boot 打包插件:用于将Spring Boot项目打包为可执行JAR -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version> <!-- 与Spring Boot版本保持一致 -->
</plugin>
</plugins>
</pluginManagement>
<!--
plugins:插件配置
- 作用:声明实际参与构建的插件(绑定到生命周期阶段)
- 父项目通常不配置具体插件,而是由子模块根据自身需求声明(继承pluginManagement中的配置)
- 【继承规则】:父项目中声明的插件会被子项目继承(不推荐,应通过pluginManagement让子项目自主选择)
-->
<plugins>
<!-- 父项目可省略具体插件,留给子模块自行声明 -->
</plugins>
</build>
<!--
distributionManagement:分发管理
- 作用:配置项目构建产物(如JAR包)的部署目标仓库
- 适用场景:团队协作时,将项目部署到公司私有仓库(如Nexus)供其他项目使用
- 可选配置,小型项目可忽略
- 【继承规则】:子项目默认继承,显式声明则覆盖
-->
<distributionManagement>
<!-- 发布版本仓库(存储正式版) -->
<repository>
<id>company-releases</id> <!-- 仓库ID,需与settings.xml中的认证信息对应 -->
<name>Company Release Repository</name>
<url>https://repo.example.com/releases</url> <!-- 私有仓库地址 -->
</repository>
<!-- 快照版本仓库(存储开发中的SNAPSHOT版本) -->
<snapshotRepository>
<id>company-snapshots</id>
<name>Company Snapshot Repository</name>
<url>https://repo.example.com/snapshots</url>
</snapshotRepository>
</distributionManagement>
<!--
developers:开发者信息
- 作用:记录项目开发者的联系方式和角色
- 可选配置,主要用于生成项目文档时显示贡献者信息
- 【继承规则】:子项目默认继承,显式声明则覆盖
-->
<developers>
<developer>
<id>dev-zhang</id> <!-- 开发者唯一标识 -->
<name>Zhang San</name> <!-- 开发者姓名 -->
<email>zhangsan@example.com</email> <!-- 联系方式 -->
<roles>
<role>architect</role> <!-- 角色:架构师 -->
</roles>
<timezone>+8</timezone> <!-- 时区 -->
</developer>
</developers>
</project>
3.2 父子项目配置要点:
- 父项目:
- 打包类型必须为pom(<packaging>pom</packaging>)
- 通过<modules>声明子模块(如<module>user-service</module>)
- 用<dependencyManagement>和<pluginManagement>管理版本
- 子项目:
- 通过<parent>声明父项目GAV坐标
- 继承父项目的groupId和version(可省略)
- 无需重复声明父项目已管理的依赖版本
3.3 继承与聚合的区别:
维度 | 继承(Inheritance) | 聚合(Aggregation) |
目的 | 复用配置 | 批量管理子模块 |
配置位置 | 子项目声明<parent> | 父项目声明<modules> |
执行命令 | 可单独构建子模块 | 父项目命令会触发所有子模块 |
四、常用命令与问题排查
4.1 核心命令:
命令 | 作用 |
mvn clean | 执行clean生命周期(删除target目录) |
mvn compile | 编译主代码(执行default到compile阶段) |
mvn test | 执行测试(含编译、测试) |
mvn package | 打包(生成JAR/WAR,含编译、测试) |
mvn install | 安装到本地仓库(含打包) |
mvn deploy | 部署到远程仓库(需配置distributionManagement) |
mvn dependency:tree | 查看依赖树(排查冲突) |
mvn help:effective-pom | 查看最终生效的POM(合并父配置) |
mvn archetype:generate | 通过原型创建项目 |
mvn -X | 开启调试模式(输出详细日志) |
4.2 常见问题与解决:
- 依赖下载失败:
- 原因:网络问题、仓库配置错误、依赖不存在
- 解决:配置国内镜像、检查依赖坐标、执行mvn dependency:purge-local-repository清理本地仓库
- 依赖冲突:
- 表现:NoClassDefFoundError、MethodNotFound
- 解决:用mvn dependency:tree找到冲突版本,在dependencyManagement中显式声明正确版本
- 子项目无法继承父配置:
- 原因:父项目packaging非pom、relativePath错误
- 解决:确认父项目<packaging>pom</packaging>,子项目添加正确<relativePath>
五、Maven知识体系总结
Maven的知识体系可归纳为"一个核心(POM)、三大支柱(生命周期、插件、依赖)、两大模式(继承、聚合)":
- 核心层:POM文件是所有配置的入口,定义项目元数据、依赖、构建规则
- 支柱层:
- 生命周期:定义构建流程的阶段顺序
- 插件:实现具体构建功能,绑定到生命周期阶段
- 依赖管理:自动管理外部库,解决依赖传递与冲突
- 扩展层:
- 父子项目:通过继承复用配置,通过聚合管理多模块
- 原型:快速生成标准化项目结构
- 仓库:管理依赖存储与分发
掌握这套体系后,不仅能解决日常构建问题,更能设计出可维护、可扩展的多模块项目架构。Maven的价值不仅在于"自动化构建",更在于通过标准化提升团队协作效率,这也是其成为Java项目管理事实标准的核心原因。
相关文章
- MyBatis如何实现分页查询?_mybatis collection分页查询
- 通过Mybatis Plus实现代码生成器,常见接口实现讲解
- MyBatis-Plus 日常使用指南_mybatis-plus用法
- 聊聊:Mybatis-Plus 新增获取自增列id,这一次帮你总结好
- MyBatis-Plus码之重器 lambda 表达式使用指南,开发效率瞬间提升80%
- Spring Boot整合MybatisPlus和Druid
- mybatis 代码生成插件free-idea-mybatis、mybatisX
- mybatis-plus 团队新作 mybatis-mate 轻松搞定企业级数据处理
- Maven 依赖范围(scope) 和 可选依赖(optional)
- Trace Sql:打通全链路日志最后一里路