Maven核心概念

发布于:2025-07-11 ⋅ 阅读:(17) ⋅ 点赞:(0)

1. Maven核心概念

1.1 什么是Maven

Maven是一个基于项目对象模型(POM)的项目管理工具,主要用于:

  • 项目构建
  • 依赖管理
  • 项目报告
  • 项目文档
  • 项目分发
  • 项目发布

1.2 Maven的核心思想

约定优于配置(Convention Over Configuration)

src/main/java        - Java源代码
src/main/resources   - 资源文件
src/main/webapp      - Web资源
src/test/java        - 测试代码
src/test/resources   - 测试资源
target               - 编译输出

依赖管理

  • 自动下载依赖
  • 传递依赖管理
  • 版本冲突解决
  • 依赖范围控制

2. Maven项目结构

2.1 标准目录结构

project-root/
├── src/
│   ├── main/
│   │   ├── java/           # Java源代码
│   │   ├── resources/      # 配置文件
│   │   └── webapp/         # Web应用资源
│   └── test/
│       ├── java/           # 测试代码
│       └── resources/      # 测试资源
├── target/                 # 编译输出
├── pom.xml                 # 项目配置文件
└── README.md

2.2 POM文件结构

<?xml version="1.0" encoding="UTF-8"?>
<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>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <!-- 项目信息 -->
    <name>My Project</name>
    <description>Project description</description>
    <url>http://example.com</url>
    
    <!-- 属性定义 -->
    <properties>
        <java.version>17</java.version>
        <spring.version>3.2.0</spring.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <!-- 依赖管理 -->
    <dependencies>
        <!-- 依赖项 -->
    </dependencies>
    
    <!-- 构建配置 -->
    <build>
        <plugins>
            <!-- 插件配置 -->
        </plugins>
    </build>
    
    <!-- 依赖管理 -->
    <dependencyManagement>
        <!-- 依赖版本管理 -->
    </dependencyManagement>
    
    <!-- 仓库配置 -->
    <repositories>
        <!-- 远程仓库 -->
    </repositories>
    
    <!-- 插件仓库 -->
    <pluginRepositories>
        <!-- 插件仓库 -->
    </pluginRepositories>
</project>

3. Maven生命周期

3.1 三大生命周期

1. Clean生命周期

pre-clean → clean → post-clean

2. Default生命周期

validate → compile → test → package → verify → install → deploy

3. Site生命周期

pre-site → site → post-site → site-deploy

3.2 生命周期详解

Default生命周期主要阶段:

阶段 描述 主要任务
validate 验证 验证项目配置是否正确
compile 编译 编译源代码
test 测试 运行单元测试
package 打包 将编译后的代码打包
verify 验证 检查包是否有效
install 安装 安装到本地仓库
deploy 部署 部署到远程仓库

3.3 生命周期绑定

<build>
    <plugins>
        <!-- 编译插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <source>17</source>
                <target>17</target>
            </configuration>
        </plugin>
        
        <!-- 测试插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.1.2</version>
        </plugin>
        
        <!-- 打包插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version>
        </plugin>
    </plugins>
</build>

4. 依赖管理

4.1 依赖坐标

<dependency>
    <groupId>org.springframework.boot</groupId>    <!-- 组织ID -->
    <artifactId>spring-boot-starter-web</artifactId> <!-- 项目ID -->
    <version>3.2.0</version>                        <!-- 版本号 -->
    <scope>compile</scope>                          <!-- 依赖范围 -->
    <optional>false</optional>                      <!-- 是否可选 -->
    <exclusions>                                    <!-- 排除传递依赖 -->
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4.2 依赖范围(Scope)

Scope 编译时 测试时 运行时 说明
compile 默认范围,所有阶段都可用
provided 由JDK或容器提供
runtime 运行时需要
test 仅测试时需要
system 系统路径依赖
import - - - 仅用于dependencyManagement

4.3 依赖传递

传递依赖规则:

直接依赖\传递依赖 compile provided runtime test
compile compile - runtime -
provided provided provided provided -
runtime runtime - runtime -
test test - test -

4.4 依赖冲突解决

1. 最短路径优先

A → B → C(1.0)
A → D → E → C(2.0)
# 选择C(1.0),路径更短

2. 第一声明优先

A → B → C(1.0)
A → D → C(2.0)
# 选择先声明的版本

3. 排除传递依赖

<dependency>
    <groupId>com.example</groupId>
    <artifactId>library</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

5. Maven仓库

5.1 仓库类型

1. 本地仓库

  • 位置:~/.m2/repository
  • 作用:存储本地下载的依赖

2. 中央仓库

  • URL:https://repo1.maven.org/maven2/
  • 作用:Maven官方仓库

3. 远程仓库

  • 私有仓库:Nexus、Artifactory
  • 镜像仓库:阿里云、华为云等

5.2 仓库配置

<!-- 远程仓库配置 -->
<repositories>
    <repository>
        <id>central</id>
        <name>Central Repository</name>
        <url>https://repo1.maven.org/maven2</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
    
    <!-- 私有仓库 -->
    <repository>
        <id>private-repo</id>
        <name>Private Repository</name>
        <url>http://nexus.company.com/repository/maven-public/</url>
    </repository>
</repositories>

<!-- 插件仓库 -->
<pluginRepositories>
    <pluginRepository>
        <id>central</id>
        <name>Central Repository</name>
        <url>https://repo1.maven.org/maven2</url>
    </pluginRepository>
</pluginRepositories>

5.3 镜像配置

<!-- settings.xml -->
<mirrors>
    <mirror>
        <id>aliyun</id>
        <name>Aliyun Maven Repository</name>
        <url>https://maven.aliyun.com/repository/public</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

6. Maven插件

6.1 常用插件

1. 编译插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <source>17</source>
        <target>17</target>
        <encoding>UTF-8</encoding>
        <compilerArgs>
            <arg>-parameters</arg>
        </compilerArgs>
    </configuration>
</plugin>

2. 资源插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.3.1</version>
    <configuration>
        <encoding>UTF-8</encoding>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
            <nonFilteredFileExtension>swf</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
    </configuration>
</plugin>

3. 打包插件

<!-- JAR打包 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.3.0</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.example.MainClass</mainClass>
                <addClasspath>true</addClasspath>
            </manifest>
        </archive>
    </configuration>
</plugin>

<!-- WAR打包 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.4.0</version>
    <configuration>
        <warSourceDirectory>src/main/webapp</warSourceDirectory>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

4. Spring Boot插件

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <mainClass>com.example.Application</mainClass>
        <excludes>
            <exclude>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </exclude>
        </excludes>
    </configuration>
</plugin>

6.2 自定义插件

@Mojo(name = "hello", defaultPhase = LifecyclePhase.COMPILE)
public class HelloMojo extends AbstractMojo {
    
    @Parameter(property = "hello.greeting", defaultValue = "Hello World!")
    private String greeting;
    
    @Parameter(property = "hello.name", defaultValue = "Maven")
    private String name;
    
    public void execute() throws MojoExecutionException {
        getLog().info(greeting + " " + name + "!");
    }
}

7. 多模块项目

7.1 项目结构

parent-project/
├── pom.xml (父POM)
├── common/
│   ├── pom.xml
│   └── src/
├── service/
│   ├── pom.xml
│   └── src/
├── web/
│   ├── pom.xml
│   └── src/
└── api/
    ├── pom.xml
    └── src/

7.2 父POM配置

<?xml version="1.0" encoding="UTF-8"?>
<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>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    
    <name>Parent Project</name>
    
    <!-- 子模块 -->
    <modules>
        <module>common</module>
        <module>service</module>
        <module>web</module>
        <module>api</module>
    </modules>
    
    <!-- 统一版本管理 -->
    <properties>
        <java.version>17</java.version>
        <spring.version>3.2.0</spring.version>
        <mybatis.version>1.8.0</mybatis.version>
    </properties>
    
    <!-- 依赖管理 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>com.mybatis-flex</groupId>
                <artifactId>mybatis-flex-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <!-- 统一插件管理 -->
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.11.0</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

7.3 子模块POM

<?xml version="1.0" encoding="UTF-8"?>
<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>
    
    <!-- 继承父POM -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0</version>
    </parent>
    
    <artifactId>common</artifactId>
    <packaging>jar</packaging>
    
    <name>Common Module</name>
    
    <dependencies>
        <!-- 依赖会自动继承版本 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
    </dependencies>
</project>

8. Maven高级特性

8.1 Profile配置

<profiles>
    <!-- 开发环境 -->
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profiles.active>dev</spring.profiles.active>
            <db.url>jdbc:mysql://localhost:3306/dev_db</db.url>
        </properties>
    </profile>
    
    <!-- 生产环境 -->
    <profile>
        <id>prod</id>
        <properties>
            <spring.profiles.active>prod</spring.profiles.active>
            <db.url>jdbc:mysql://prod-server:3306/prod_db</db.url>
        </properties>
    </profile>
</profiles>

8.2 资源过滤

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>

8.3 属性替换

# application.properties
db.url=${db.url}
spring.profiles.active=${spring.profiles.active}

8.4 Maven Wrapper

# 生成Maven Wrapper
mvn wrapper:wrapper

# 使用Wrapper
./mvnw clean install
./mvnw spring-boot:run

9. 最佳实践

9.1 依赖管理最佳实践

  1. 使用dependencyManagement统一版本
  2. 避免使用SNAPSHOT版本
  3. 及时更新依赖版本
  4. 使用BOM管理依赖

9.2 插件配置最佳实践

  1. 明确指定插件版本
  2. 合理配置插件参数
  3. 避免重复配置

9.3 项目结构最佳实践

  1. 遵循Maven标准目录结构
  2. 合理划分模块
  3. 使用继承和聚合

9.4 性能优化

  1. 使用本地仓库
  2. 配置镜像仓库
  3. 合理使用并行构建
  4. 避免不必要的依赖

10. 常见问题解决

10.1 依赖冲突

# 查看依赖树
mvn dependency:tree

# 分析依赖冲突
mvn dependency:analyze

# 排除冲突依赖
mvn dependency:resolve

10.2 构建失败

# 清理项目
mvn clean

# 跳过测试
mvn install -DskipTests

# 强制更新依赖
mvn clean install -U

10.3 内存不足

# 增加Maven内存
export MAVEN_OPTS="-Xmx2048m -XX:MaxPermSize=512m"

# 使用并行构建
mvn clean install -T 4

Maven是一个功能强大的项目管理工具,掌握其核心概念和高级特性对于Java开发至关重要。通过合理配置和使用Maven,可以大大提高项目开发效率和质量。


网站公告

今日签到

点亮在社区的每一天
去签到