不灭的焱

革命尚未成功,同志仍须努力 下载Java21

作者:AlbertWen  添加时间:2026-06-13 16:53:56  修改时间:2026-06-20 02:41:11  分类:07.Java框架/系统  编辑

以下命令行的区别与联系:

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