一、Maven 基础概念
1.1 Maven 概述
Maven是一个项目管理和构建自动化工具。它使用项目对象模型(POM)的概念,提供了一种标准化的项目结构,一个强大的依赖管理系统,以及一套标准的构建生命周期。
1.2 Maven 核心概念
- POM:Project Object Model,项目对象模型
- 坐标:groupId, artifactId, version(GAV)
- 仓库:本地仓库、中央仓库、私服
- 生命周期:clean, default, site
- 插件:Maven 的功能扩展
1.3 核心特性
- 标准化项目结构:提供统一的项目目录结构,便于开发者快速理解项目。
- 依赖管理:自动下载和管理项目依赖,支持传递性依赖。
- 构建生命周期:预定义的构建阶段,如编译、测试、打包、部署等。
- 插件机制:通过插件扩展构建过程,支持自定义插件。
- 中央仓库:庞大的中央仓库和镜像,提供大量开源库。
二、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开发中最常见的问题之一。当项目中存在多个版本的同一依赖时,就会出现冲突。
其冲突类型主要有:
- 直接冲突:项目中直接声明了同一个依赖的不同版本
- 传递性冲突:依赖的依赖(传递依赖)版本不一致
- 隐式冲突:不同依赖包中包含相同的类,但实现不同
Maven 使用"最近原则"和"第一声明原则"解决依赖冲突。
-
最近原则:选择依赖树中离项目最近的那个版本。
bashA ├── 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>
-
快照版本的特点
- 不稳定性:快照版本是正在开发的版本,随时可能有新的代码提交,因此构件内容可能会频繁变化。
- 唯一性:每次部署到仓库的快照构件都会带有时间戳和构建号,以区分不同的构建。
- 更新策略:默认情况下,Maven会每天检查一次快照版本的更新,也可以配置为每次构建都检查更新。
-
快照版本的使用场景
- 团队内部开发:在同一个团队中,多个模块并行开发,且模块之间存在依赖关系,可以使用快照版本进行联调。
- 持续集成:在持续集成环境中,每次构建都可能产生一个快照版本,用于测试。
-
快照版本的工作机制
当Maven处理快照依赖时:
- 检查本地仓库是否有该快照
- 定期检查远程仓库是否有更新
- 默认每天检查一次,可通过配置调整频率
-
快照版本的更新机制
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的风格 -->
-
发布版本的特点
- 稳定性:发布版本是经过测试的、稳定的版本,构件内容不会改变。
- 唯一性:同一个发布版本的构件在仓库中只存在一份,重复部署会覆盖已有的构件(但通常不建议重复部署发布版本)。
- 更新策略:默认情况下,Maven不会主动检查发布版本的更新,除非本地仓库中不存在该版本。
-
发布版本的使用场景
- 生产环境:发布版本用于生产环境的部署。
- 对外发布:当项目达到一个稳定的里程碑时,可以发布一个发布版本,供其他团队或外部系统使用。
-
发布版本的工作机制:
- 当项目版本设置为发布版本时,Maven在构建项目时会将该构件部署到发布仓库中。部署后,该版本不应该再被修改。如果需要进行修改,应该升级版本号并重新发布。
-
发布仓库配置
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 # 部署帮助