Maven核心概念

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 依赖传递

传递依赖规则:

直接依赖\传递依赖compileprovidedruntimetest
compilecompile-runtime-
providedprovidedprovidedprovided-
runtimeruntime-runtime-
testtest-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,可以大大提高项目开发效率和质量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TracyCoder123

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

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

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

打赏作者

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

抵扣说明:

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

余额充值