以下命令行的区别与联系:
mvn clean compile -DskipTests mvn clean package -DskipTests mvn clean install -DskipTests
这 3 个命令的核心区别在于:执行到 Maven 生命周期的哪个阶段。
它们都属于 Maven 默认生命周期:
clean → compile → test → package → verify → install → deploy
这里都加了:
-DskipTests
表示:跳过测试执行。通常测试代码仍可能被编译,具体行为后面说明。
1. mvn clean compile -DskipTests
作用:
mvn clean compile -DskipTests
等价于:
先清理 target 目录 再编译 main 源码
会做:
| 动作 | 是否执行 |
|---|---|
| 删除 target/ | 是 |
| 编译 src/main/java | 是 |
| 编译 src/test/java | 通常否 |
| 执行测试 | 否 |
| 打 jar/war 包 | 否 |
| 安装到本地 Maven 仓库 | 否 |
执行后通常生成:
target/classes/
不会生成正式的:
target/xxx.jar target/xxx.war
适合场景:
只想检查代码能不能编译通过
2. mvn clean package -DskipTests
作用:
mvn clean package -DskipTests
等价于:
清理 → 编译 → 处理资源 → 打包
会执行到 package 阶段。
会做:
| 动作 | 是否执行 |
|---|---|
| 删除 target/ | 是 |
| 编译 src/main/java | 是 |
| 执行测试 | 否 |
| 打 jar/war 包 | 是 |
| 安装到本地 Maven 仓库 | 否 |
执行后通常生成:
target/your-app.jar
或者:
target/your-app.war
适合场景:
本地构建一个可运行/可部署的包
比如 Spring Boot 项目通常会生成:
target/demo-0.0.1-SNAPSHOT.jar
然后可以运行:
java -jar target/demo-0.0.1-SNAPSHOT.jar
3. mvn clean install -DskipTests
作用:
mvn clean install -DskipTests
等价于:
清理 → 编译 → 打包 → 安装到本地 Maven 仓库
会执行到 install 阶段。
会做:
| 动作 | 是否执行 |
|---|---|
| 删除 target/ | 是 |
| 编译源码 | 是 |
| 执行测试 | 否 |
| 打 jar/war 包 | 是 |
| 安装到本地 Maven 仓库 ~/.m2/repository | 是 |
执行后除了生成:
target/your-app.jar
还会把构建产物安装到本地 Maven 仓库:
~/.m2/repository/groupId/artifactId/version/
例如:
<groupId>com.example</groupId> <artifactId>common-utils</artifactId> <version>1.0.0</version>
执行 install 后,本地会出现:
~/.m2/repository/com/example/common-utils/1.0.0/common-utils-1.0.0.jar
适合场景:
当前项目是一个公共模块,需要被本机其他 Maven 项目引用
例如你有两个项目:
common-utils business-app
business-app 依赖:
<dependency>
<groupId>com.example</groupId>
<artifactId>common-utils</artifactId>
<version>1.0.0</version>
</dependency>
那么你需要先在 common-utils 执行:
mvn clean install -DskipTests
否则 business-app 可能找不到这个依赖。
三者关系
可以理解为一层一层递进:
compile 只编译 package 编译 + 打包 install 编译 + 打包 + 安装到本地仓库
用图表示:
mvn clean compile -DskipTests
↓
生成 target/classes
mvn clean package -DskipTests
↓
生成 target/classes
生成 target/*.jar 或 target/*.war
mvn clean install -DskipTests
↓
生成 target/classes
生成 target/*.jar 或 target/*.war
复制 jar/war/pom 到 ~/.m2/repository
-DskipTests 和 -Dmaven.test.skip=true 的区别
这里用的是:
-DskipTests
它通常表示:
跳过测试执行,但可能仍编译测试代码
更彻底的是:
-Dmaven.test.skip=true
它表示:
跳过测试编译 + 跳过测试执行
对比:
| 参数 | 编译测试代码 | 执行测试 |
|---|---|---|
| -DskipTests | 通常会 | 不会 |
| -Dmaven.test.skip=true | 不会 | 不会 |
如果你的测试代码本身编译报错,可以用:
mvn clean package -Dmaven.test.skip=true
如果只是测试用例执行慢或失败,但测试代码可以正常编译,用:
mvn clean package -DskipTests
实际开发中怎么选?
| 场景 | 推荐命令 |
|---|---|
| 只检查主代码能不能编译 | mvn clean compile -DskipTests |
| 构建 jar/war 包准备运行或部署 | mvn clean package -DskipTests |
| 构建公共模块并给本机其他项目依赖 | mvn clean install -DskipTests |
| CI/CD 构建镜像或部署包 | 常用 mvn clean package |
| 多模块项目,本地调试依赖关系 | 常用 mvn clean install |
一句话总结
compile:编译代码 package:编译代码 + 打包成 jar/war install:编译代码 + 打包 + 放进本地 Maven 仓库
所以日常最常用的是:
mvn clean package -DskipTests
如果当前模块还要被本机其他项目引用,就用:
mvn clean install -DskipTests