Maven 使用指南

一、Maven 基础概念

1.1 Maven 概述

Maven是一个项目管理和构建自动化工具。它使用项目对象模型(POM)的概念,提供了一种标准化的项目结构,一个强大的依赖管理系统,以及一套标准的构建生命周期。

1.2 Maven 核心概念

  • POM:Project Object Model,项目对象模型
  • 坐标:groupId, artifactId, version(GAV)
  • 仓库:本地仓库、中央仓库、私服
  • 生命周期:clean, default, site
  • 插件:Maven 的功能扩展

1.3 核心特性

  1. 标准化项目结构:提供统一的项目目录结构,便于开发者快速理解项目。
  2. 依赖管理:自动下载和管理项目依赖,支持传递性依赖。
  3. 构建生命周期:预定义的构建阶段,如编译、测试、打包、部署等。
  4. 插件机制:通过插件扩展构建过程,支持自定义插件。
  5. 中央仓库:庞大的中央仓库和镜像,提供大量开源库。

二、Maven 项目结构

2.1 标准目录结构

Maven 使用约定优于配置的原则,定义了标准的项目结构:

bash 复制代码
项目根目录
│
├── pom.xml
│
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com/example/App.java
│   │   ├── resources
│   │   │   └── application.properties
│   │   └── webapp
│   │       └── WEB-INF/web.xml
│   │
│   └── test
│       ├── java
│       │   └── com/example/AppTest.java
│       └── resources
│           └── test.properties
│
└── target
    ├── classes
    └── test-classes

2.2 POM(Project Object Model)

POM是Maven的核心配置文件,使用XML格式(pom.xml),描述了项目的基本信息、依赖关系、构建配置等。

2.2.1 基本元素

xml 复制代码
<!-- 基本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>
    
    <!-- 项目坐标(GAV) -->
    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <!-- 项目属性 -->
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <!-- 依赖管理 -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <!-- 构建配置 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
            </plugin>
        </plugins>
    </build>
</project>

2.2.2 坐标(Coordinates)

Maven 使用坐标唯一标识一个项目或依赖,包括:

  • groupId:组织或团体的唯一标识,通常使用反向域名
  • artifactId:项目在组织中的唯一标识
  • version:项目的版本号
  • packaging:打包方式,如 jar、war、pom 等

三、Maven 依赖管理

3.1 依赖范围(Scope)

  • compile:默认范围,参与编译、测试、运行
  • provided:编译和测试需要,运行时由容器提供
  • runtime:运行和测试需要,编译时不需要
  • test:仅测试需要
  • system:与 provided 类似,但需显式指定本地路径
  • import:仅用于 dependencyManagement,导入 BOM
xml 复制代码
<dependencies>
    <!-- compile: 默认范围,编译、测试、运行都有效 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.23</version>
        <scope>compile</scope>
    </dependency>
    
    <!-- provided: 编译和测试有效,运行时由容器提供 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    
    <!-- runtime: 测试和运行时有效 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.32</version>
        <scope>runtime</scope>
    </dependency>
    
    <!-- test: 仅测试有效 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
    
    <!-- system: 类似provided,但需显式指定jar路径 -->
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>custom-lib</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/custom-lib.jar</systemPath>
    </dependency>
    
    <!-- import: 仅用于dependencyManagement,导入其他pom的依赖管理 -->
</dependencies>

3.2 依赖管理(dependencyManagement)

在父 POM 中统一管理版本,子模块可以省略版本号,确保版本一致。

xml 复制代码
<!-- dependencyManagement 统一管理版本 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>5.3.23</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 实际依赖声明,无需指定版本 -->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <!-- 版本从BOM中继承 -->
    </dependency>
</dependencies>

3.3 传递性依赖

Maven 会自动解析依赖的依赖(传递性依赖),可以通过 排除不需要的传递性依赖。

xml 复制代码
<!-- 依赖排除 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3.4 可选依赖(optional)

标记为可选的依赖不会被传递性引入。

xml 复制代码
<!-- 可选依赖 -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version>
    <optional>true</optional>  <!-- 可选依赖,不会传递 -->
</dependency>

四、Maven 生命周期与插件

Maven 有三套独立的生命周期:clean、default、site。

bash 复制代码
# 清理项目
mvn clean

# 编译项目
mvn compile
mvn test-compile  # 仅编译测试代码

# 运行测试
mvn test
mvn test -Dtest=TestClassName  # 运行特定测试类
mvn test -Dtest=TestClassName#methodName  # 运行特定测试方法

# 打包
mvn package
mvn package -DskipTests  # 跳过测试

# 安装到本地仓库
mvn install

# 部署到远程仓库
mvn deploy

# 生成站点文档
mvn site

4.1 clean 生命周期

  • pre-clean:执行清理前的工作
  • clean:清理上一次构建生成的文件
  • post-clean:执行清理后的工作

4.2 default 生命周期(核心)

  • validate:验证项目是否正确
  • compile:编译源代码
  • test:运行单元测试
  • package:打包成可发布的格式(如 JAR、WAR)
  • verify:运行集成测试
  • install:将包安装到本地仓库
  • deploy:将包部署到远程仓库

4.3 site 生命周期

  • pre-site:生成站点前的工作
  • site:生成项目站点文档
  • post-site:生成站点后的工作
  • site-deploy:部署站点到服务器

五、插件(Plugins)

Maven 的核心功能由插件完成,每个构建阶段都由特定的插件执行。

5.1 常用插件

  • maven-compiler-plugin:编译 Java 代码
  • maven-surefire-plugin:运行单元测试
  • maven-failsafe-plugin:运行集成测试
  • maven-jar-plugin:打包 JAR
  • maven-war-plugin:打包 WAR
  • maven-dependency-plugin:管理依赖(复制、分析等)
  • maven-release-plugin:发布项目
  • maven-site-plugin:生成站点

5.2 插件配置示例

xml 复制代码
<!-- 编译器插件 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.10.1</version>
    <configuration>
        <source>17</source>
        <target>17</target>
        <encoding>UTF-8</encoding>
        <compilerArgs>
            <arg>-parameters</arg>  <!-- 保留方法参数名 -->
            <arg>-Xlint:all</arg>   <!-- 启用所有警告 -->
        </compilerArgs>
        <showWarnings>true</showWarnings>
        <showDeprecation>true</showDeprecation>
        <fork>true</fork>  <!-- 使用独立的JVM进程 -->
        <meminitial>512m</meminitial>
        <maxmem>2048m</maxmem>
    </configuration>
</plugin>

<!-- 资源插件 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.3.0</version>
    <configuration>
        <delimiters>
            <delimiter>@</delimiter>  <!-- 自定义分隔符 -->
        </delimiters>
        <useDefaultDelimiters>false</useDefaultDelimiters>
        <escapeString>\</escapeString>
        <!-- 过滤资源配置 -->
        <filters>
            <filter>src/main/filters/filter-${env}.properties</filter>
        </filters>
    </configuration>
</plugin>

<!-- 打包插件 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.example.Main</mainClass>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
            </manifest>
            <manifestEntries>
                <Implementation-Version>${project.version}</Implementation-Version>
                <Built-By>${user.name}</Built-By>
                <Build-Timestamp>${maven.build.timestamp}</Build-Timestamp>
            </manifestEntries>
        </archive>
        <excludes>
            <exclude>**/*.properties</exclude>
            <exclude>**/*.xml</exclude>
        </excludes>
    </configuration>
</plugin>

<!-- WAR打包插件 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.2</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <webResources>
            <resource>
                <directory>src/main/webapp</directory>
                <filtering>true</filtering>
            </resource>
        </webResources>
        <packagingExcludes>
            WEB-INF/lib/*.jar
        </packagingExcludes>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>WEB-INF/lib/</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>

<!-- 发布插件 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin</artifactId>
    <version>2.5.3</version>
    <configuration>
        <tagNameFormat>v@{project.version}</tagNameFormat>
        <autoVersionSubmodules>true</autoVersionSubmodules>
        <releaseProfiles>release</releaseProfiles>
        <goals>deploy</goals>
        <arguments>-Prelease</arguments>
        <preparationGoals>clean verify</preparationGoals>
        <completionGoals>deploy</completionGoals>
    </configuration>
</plugin>

六、多模块管理

Maven 支持多模块项目,通过一个父模块管理多个子模块。

bash 复制代码
parent-project/
├── pom.xml                        # 父POM
├── common/                        # 公共模块
│   ├── pom.xml
│   └── src/
├── domain/                        # 领域模块
│   ├── pom.xml
│   └── src/
├── service/                       # 服务模块
│   ├── pom.xml
│   └── src/
├── web/                           # Web模块
│   ├── pom.xml
│   └── src/
└── integration-tests/             # 集成测试模块
    ├── pom.xml
    └── src/

6.1 父模块 POM

父模块的 packaging 必须为 pom,并声明子模块:

xml 复制代码
<!-- parent/pom.xml -->
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    
    <name>Parent Project</name>
    
    <!-- 模块声明 -->
    <modules>
        <module>common</module>
        <module>domain</module>
        <module>service</module>
        <module>web</module>
        <module>integration-tests</module>
    </modules>
    
    <!-- 依赖管理 -->
    <dependencyManagement>
        <dependencies>
            <!-- 统一版本管理 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            
            <!-- 自定义依赖版本 -->
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>common</artifactId>
                <version>${project.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <!-- 构建管理 -->
    <build>
        <pluginManagement>
            <plugins>
                <!-- 插件版本统一管理 -->
            </plugins>
        </pluginManagement>
        
        <!-- 所有模块共享的插件配置 -->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
    <!-- 报告配置 -->
    <reporting>
        <plugins>
            <!-- 所有模块共享的报告插件 -->
        </plugins>
    </reporting>
</project>

6.2 子模块 POM

子模块继承父模块,只需指定父模块的坐标,无需指定版本:

xml 复制代码
<!-- common/pom.xml -->
<project>
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 继承父POM -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    
    <artifactId>common</artifactId>
    <packaging>jar</packaging>
    
    <dependencies>
        <!-- 从dependencyManagement继承版本 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
    </dependencies>
</project>

<!-- web/pom.xml -->
<project>
    <modelVersion>4.0.0</modelVersion>
    
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    
    <artifactId>web</artifactId>
    <packaging>war</packaging>
    
    <dependencies>
        <!-- 依赖其他模块 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>common</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>service</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>domain</artifactId>
        </dependency>
    </dependencies>
</project>

七、Maven 高级特性

7.1 属性(Properties)

可以定义属性并在 POM 中引用,例如:

xml 复制代码
<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

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

7.2 资源过滤(Resource Filtering)

在资源文件中使用 Maven 属性,构建时替换为实际值。

xml 复制代码
<!-- 配置文件中的变量引用 -->
# application.properties
app.name=@project.name@
app.version=@project.version@
database.url=@database.url@
log.level=@log.level@

<!-- 资源过滤配置 -->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.yml</include>
                <include>**/*.yaml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.json</include>
            </includes>
        </resource>
    </resources>
</build>

7.3 构建配置(Profiles)

根据不同环境(如开发、测试、生产)使用不同的配置。

bash 复制代码
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <env>development</env>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <env>production</env>
        </properties>
    </profile>
</profiles>

激活方式:

  • 命令行:mvn clean install -P dev
  • 配置文件:~/.m2/settings.xml
  • 环境变量
  • 操作系统
  • 文件是否存在

7.4 依赖冲突解决

依赖冲突是Maven开发中最常见的问题之一。当项目中存在多个版本的同一依赖时,就会出现冲突。

其冲突类型主要有:

  1. 直接冲突:项目中直接声明了同一个依赖的不同版本
  2. 传递性冲突:依赖的依赖(传递依赖)版本不一致
  3. 隐式冲突:不同依赖包中包含相同的类,但实现不同

Maven 使用"最近原则"和"第一声明原则"解决依赖冲突。

  • 最近原则:选择依赖树中离项目最近的那个版本。

    bash 复制代码
    A
    ├── B
    │   └── D 2.0 (路径长度:2)
    └── C
        └── E
            └── D 1.0 (路径长度:3)
            
    结果:选择 D 2.0(路径更短)
  • 第一声明原则:如果路径长度相同,则优先选择在 POM 中先声明的依赖版本。

    bash 复制代码
    <dependencies>
        <!-- 先声明 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>lib-a</artifactId>
            <version>1.0</version>
        </dependency>
        
        <!-- 后声明 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>lib-b</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>

7.5 快照(Snapshot)与发布(Release)

Maven中的快照(Snapshot)和发布(Release)是两种不同的构件版本类型,它们在项目构建和依赖管理中扮演着不同的角色。

7.5.1 快照版本

快照版本代表项目的开发中版本,它是一个不稳定的、处于开发中的版本。快照版本的构件名称中带有"-SNAPSHOT"后缀,例如:1.0.0-SNAPSHOT。

xml 复制代码
<!-- 快照版本示例 -->
<version>1.0.0-SNAPSHOT</version>
<version>2.1-SNAPSHOT</version>
<version>0.0.1-SNAPSHOT</version>
  1. 快照版本的特点

    • 不稳定性:快照版本是正在开发的版本,随时可能有新的代码提交,因此构件内容可能会频繁变化。
    • 唯一性:每次部署到仓库的快照构件都会带有时间戳和构建号,以区分不同的构建。
    • 更新策略:默认情况下,Maven会每天检查一次快照版本的更新,也可以配置为每次构建都检查更新。
  2. 快照版本的使用场景

    • 团队内部开发:在同一个团队中,多个模块并行开发,且模块之间存在依赖关系,可以使用快照版本进行联调。
    • 持续集成:在持续集成环境中,每次构建都可能产生一个快照版本,用于测试。
  3. 快照版本的工作机制

    当Maven处理快照依赖时:

    • 检查本地仓库是否有该快照
    • 定期检查远程仓库是否有更新
    • 默认每天检查一次,可通过配置调整频率
  4. 快照版本的更新机制

    xml 复制代码
    <!-- 配置快照更新策略 -->
    <repository>
        <id>snapshots-repo</id>
        <url>http://nexus.company.com/repository/snapshots/</url>
        <!-- 更新策略配置 -->
        <snapshots>
            <enabled>true</enabled>
            <!-- 更新频率 -->
            <updatePolicy>always</updatePolicy> <!-- 每次构建都检查 -->
            <!-- 或 -->
            <updatePolicy>daily</updatePolicy>   <!-- 每天检查一次(默认) -->
            <!-- 或 -->
            <updatePolicy>interval:60</updatePolicy> <!-- 每60分钟检查 -->
            <!-- 或 -->
            <updatePolicy>never</updatePolicy>    <!-- 从不检查更新 -->
        </snapshots>
    </repository>

7.5.2 发布版本

发布版本代表稳定的、可用于生产环境的版本。一旦发布,就不能修改,确保构建的可重复性。发布版本的构件名称中不包含"-SNAPSHOT"后缀,例如:1.0.0。

bash 复制代码
<!-- 发布版本示例 -->
<version>1.0.0</version>
<version>2.1.0</version>
<version>3.0.0-RELEASE</version> <!-- 也可以使用其他后缀 -->
<version>4.5.0.Final</version>   <!-- 如Hibernate的风格 -->
  1. 发布版本的特点

    • 稳定性:发布版本是经过测试的、稳定的版本,构件内容不会改变。
    • 唯一性:同一个发布版本的构件在仓库中只存在一份,重复部署会覆盖已有的构件(但通常不建议重复部署发布版本)。
    • 更新策略:默认情况下,Maven不会主动检查发布版本的更新,除非本地仓库中不存在该版本。
  2. 发布版本的使用场景

    • 生产环境:发布版本用于生产环境的部署。
    • 对外发布:当项目达到一个稳定的里程碑时,可以发布一个发布版本,供其他团队或外部系统使用。
  3. 发布版本的工作机制:

    • 当项目版本设置为发布版本时,Maven在构建项目时会将该构件部署到发布仓库中。部署后,该版本不应该再被修改。如果需要进行修改,应该升级版本号并重新发布。
  4. 发布仓库配置

    xml 复制代码
    <!-- 发布仓库配置 -->
    <repository>
        <id>releases-repo</id>
        <url>http://nexus.company.com/repository/releases/</url>
        <releases>
            <enabled>true</enabled>
            <!-- 更新策略 -->
            <updatePolicy>never</updatePolicy> <!-- 从不自动更新(默认) -->
            <!-- 或 -->
            <updatePolicy>daily</updatePolicy>  <!-- 可配置但不推荐 -->
        </releases>
        <snapshots>
            <enabled>false</enabled> <!-- 发布仓库禁用快照 -->
        </snapshots>
    </repository>

八、Maven 命令

8.1 Maven 命令基础语法

bash 复制代码
mvn [选项] [生命周期阶段] [目标]
mvn [options] <phase> <goal>

8.2 常用全局选项

bash 复制代码
# 指定配置文件
mvn -s /path/to/settings.xml clean install
mvn -gs /path/to/global-settings.xml clean package

# 指定POM文件
mvn -f /path/to/pom.xml clean install
mvn -f ../parent/pom.xml clean install

# 调试选项
mvn -X clean compile                # 详细调试输出
mvn -e package                      # 显示错误详情
mvn -q dependency:tree              # 安静模式,只输出错误
mvn -l build.log clean install      # 输出日志到文件

# 性能优化选项
mvn -T 4 clean install              # 使用4个线程并行构建
mvn -o compile                      # 离线模式(使用本地缓存)
mvn -U clean install                # 强制更新快照依赖
mvn -DskipTests package             # 跳过测试
mvn -Dmaven.test.skip=true install  # 跳过测试编译和执行

# 环境控制
mvn -P production clean deploy      # 激活production profile
mvn -Denv=prod clean package        # 设置系统属性

8.3 核心生命周期命令

8.3.1 清理生命周期(clean)

bash 复制代码
# 清理项目
mvn clean                          # 删除target目录
mvn clean:clean                    # 直接调用clean目标

# 清理其他目录
mvn clean -DoutputDirectory=dist   # 清理指定目录
mvn clean compile                  # 清理后编译

8.3.2 默认生命周期(default)

bash 复制代码
# 验证项目
mvn validate                       # 验证项目正确性和完整性

# 编译相关
mvn compile                        # 编译主代码
mvn test-compile                   # 编译测试代码
mvn process-classes               # 处理编译后的类文件
mvn generate-sources               # 生成源代码

# 测试相关
mvn test                          # 运行单元测试
mvn test -Dtest=TestClass         # 运行指定测试类
mvn test -Dtest=TestClass#method  # 运行指定测试方法
mvn test -Dtest=TestClass1,TestClass2 # 运行多个测试类
mvn test -Dtest="*Test"           # 运行匹配模式的所有测试

# 打包相关
mvn package                       # 打包(jar/war/ear)
mvn package -DskipTests           # 跳过测试打包
mvn package -Dmaven.test.skip=true # 完全跳过测试

# 安装部署
mvn install                       # 安装到本地仓库
mvn deploy                        # 部署到远程仓库
mvn site                          # 生成项目站点
mvn site-deploy                   # 部署站点到服务器

8.3.3 站点生命周期(site)

bash 复制代码
mvn site                          # 生成项目站点文档
mvn site:run                      # 启动站点服务器(默认端口8080)
mvn site:run -Dport=9090         # 指定端口启动
mvn site:deploy                   # 部署站点到远程服务器
mvn site:stage                    # 生成站点的临时版本

8.4 依赖分析命令

bash 复制代码
# 查看依赖树
mvn dependency:tree
mvn dependency:tree -Dverbose           # 详细模式
mvn dependency:tree -Dincludes=com.google.guava

# 分析依赖冲突
mvn dependency:analyze
mvn dependency:analyze-duplicate

# 查看依赖更新
mvn versions:display-dependency-updates

# 下载源码和Javadoc
mvn dependency:sources
mvn dependency:resolve -Dclassifier=javadoc

# 复制依赖到指定目录
mvn dependency:copy-dependencies -DoutputDirectory=lib

# 依赖传递性排除分析
mvn dependency:analyze-dep-mgt

8.5 依赖冲突解决命令

bash 复制代码
# 检查依赖冲突
mvn dependency:tree -Dverbose | grep -i conflict
mvn dependency:tree -Dverbose | grep -i omitted

# 强制更新依赖
mvn clean install -U                                # 强制更新快照依赖
mvn versions:force-releases                         # 强制使用发布版本

# 生成依赖报告
mvn project-info-reports:dependencies               # 生成依赖报告

8.6 插件执行命令

bash 复制代码
# 编译器插件
mvn compiler:compile                               # 编译主代码
mvn compiler:testCompile                           # 编译测试代码
mvn compiler:help -Ddetail=true                    # 查看编译器帮助

# 资源插件
mvn resources:resources                            # 复制资源文件
mvn resources:testResources                        # 复制测试资源
mvn resources:copy-resources -DoutputDirectory=config # 复制到指定目录

# 打包插件
mvn jar:jar                                        # 创建jar包
mvn jar:test-jar                                   # 创建测试jar包
mvn war:war                                        # 创建war包
mvn war:exploded                                   # 创建解压的war目录
mvn ear:ear                                        # 创建ear包

# 源码插件
mvn source:jar                                     # 生成源码jar包
mvn source:test-jar                                # 生成测试源码jar包
mvn source:aggregate                               # 聚合多模块源码

# JavaDoc插件
mvn javadoc:javadoc                                # 生成JavaDoc
mvn javadoc:jar                                    # 生成JavaDoc的jar包
mvn javadoc:aggregate                              # 聚合多模块JavaDoc
mvn javadoc:test-javadoc                           # 生成测试代码的JavaDoc

# 版本插件
mvn versions:display-dependency-updates            # 显示依赖更新
mvn versions:display-plugin-updates                # 显示插件更新
mvn versions:display-property-updates              # 显示属性更新

8.7 发布插件命令

bash 复制代码
# 发布管理
mvn release:prepare                                # 准备发布
mvn release:prepare -DdryRun=true                  # 模拟发布
mvn release:prepare -DreleaseVersion=1.0.0 -DdevelopmentVersion=1.1.0-SNAPSHOT
mvn release:perform                                # 执行发布
mvn release:rollback                               # 回滚发布
mvn release:clean                                  # 清理发布文件

# 部署命令
mvn deploy:deploy-file                             # 部署文件到仓库
mvn deploy:help                                    # 部署帮助
相关推荐
毕设源码-郭学长8 小时前
【开题答辩全过程】以 基于SSM的高校运动会管理系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
xiaolyuh1238 小时前
Arthas修改类(如加日志)的实现原理
java
栗子叶8 小时前
Java对象创建的过程
java·开发语言·jvm
有一个好名字9 小时前
力扣-从字符串中移除星号
java·算法·leetcode
zfj3219 小时前
CyclicBarrier、CountDownLatch、Semaphore 各自的作用和用法区别
java·开发语言·countdownlatch·semaphore·cyclicbarrier
2501_916766549 小时前
【JVM】类的加载机制
java·jvm
Sag_ever9 小时前
Java数组详解
java
张np9 小时前
java基础-ConcurrentHashMap
java·开发语言
一嘴一个橘子9 小时前
spring-aop 的 基础使用 - 4 - 环绕通知 @Around
java