Maven Wrapper(mvnw)自动安装mvn

mvnw 脚本实际上是 Maven Wrappe 的启动脚本,它用于在项目中自动定位、下载并执行特定版本的 Maven,而无需依赖系统全局的 Maven。


一、mvnw 的核心执行逻辑

最后的关键执行语句是:

1
2
3
4
5
6
7
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

等价于:

1
2
3
4
java $MAVEN_OPTS -classpath .mvn/wrapper/maven-wrapper.jar \
-Dmaven.home=$M2_HOME \
-Dmaven.multiModuleProjectDirectory=$PWD \
org.apache.maven.wrapper.MavenWrapperMain <maven命令参数>

所以 mvnw 其实只是封装执行:

java + maven-wrapper.jar + 你的 mvn 参数


二、拆分后得到的可执行命令

你可以把构建命令拆成两种版本:

1. 直接等价于 mvnw 的完整命令

如果项目中已经有 .mvn/wrapper/maven-wrapper.jar

1
2
3
java -classpath .mvn/wrapper/maven-wrapper.jar \
-Dmaven.multiModuleProjectDirectory="$PWD" \
org.apache.maven.wrapper.MavenWrapperMain clean package -DskipTests

这行命令 = ./mvnw clean package -DskipTests

💡 等价于 mvn clean package -DskipTests,但它自动下载对应 Maven 版本。


2. 使用系统 Maven

若系统中已有 mvn

1
mvn clean package -DskipTests

或根据你的实际场景:

目标 命令
仅解析依赖 mvn dependency:resolve
只编译 mvn compile
打包 mvn package
安装到本地仓库 mvn install
跳过测试 mvn clean package -DskipTests
指定 profile mvn clean package -Pprod
跳过 Ant/Jenkins 插件 mvn clean package -DskipAntRunForJenkins

三、进阶整合

在 CI/CD(Jenkins、GitLab CI、Drone、Argo 等)中,一般会这样拆分:

1
2
3
4
5
6
7
8
9
10
# step 1: backend build
./mvnw clean package -DskipTests

# step 2: frontend build
pnpm install --frozen-lockfile
pnpm run build

# step 3: package and push image
docker build -t your-app:${VERSION} .
docker push your-app:${VERSION}