哪个插件提供package?mvn package究竟是什么?
package的本质与对应插件解析 作为Maven新手,我了解到常规命令格式是mvn pluginId:goalId,比如mvn compiler:compile就是调用compiler插件的compile目标。但mvn package明显不遵循这个格式,它看起来是直接运行某个"阶段",这让我很困惑。
为了找到提供package功能的插件,我执行了以下命令:
mvn help:describe -Dcmd=package
得到的结果如下:
It is a part of the lifecycle for the POM packaging 'jar'. This lifecycle includes the following phases: * validate: Not defined * initialize: Not defined * generate-sources: Not defined * process-sources: Not defined * generate-resources: Not defined * process-resources: org.apache.maven.plugins:maven-resources-plugin:2.6:resources * compile: org.apache.maven.plugins:maven-compiler-plugin:3.1:compile * process-classes: Not defined * generate-test-sources: Not defined * process-test-sources: Not defined * generate-test-resources: Not defined * process-test-resources: org.apache.maven.plugins:maven-resources-plugin:2.6:testResources * test-compile: org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile * process-test-classes: Not defined * test: org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test * prepare-package: Not defined * package: org.apache.maven.plugins:maven-jar-plugin:2.4:jar * pre-integration-test: Not defined * integration-test: Not defined * post-integration-test: Not defined * verify: Not defined * install: org.apache.maven.plugins:maven-install-plugin:2.4:install * deploy: org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
看到* compile: org.apache.maven.plugins:maven-compiler-plugin:3.1:compile这一行,我类比着认为能找到对应package目标的插件,于是根据* package: org.apache.maven.plugins:maven-jar-plugin:2.4:jar尝试运行mvn jar:package,结果报错;执行mvn help:describe -Dplugin=package也失败了。
关键疑问解答
mvn package中的package是什么?package是Maven的生命周期阶段,不是插件ID或插件目标。Maven定义了三套核心生命周期(clean、default、site),每个生命周期包含一系列有序的阶段。执行某个阶段时,Maven会自动按顺序执行该阶段之前的所有阶段(比如执行mvn package会依次执行validate、compile、test等前置阶段)。哪个插件提供package的功能?
当项目POM中packaging为jar时,package阶段绑定的是maven-jar-plugin的jar目标(对应结果里的org.apache.maven.plugins:maven-jar-plugin:2.4:jar)。也就是说,执行mvn package时,最终是由maven-jar-plugin的jar目标完成打包生成jar包的操作。
你尝试mvn jar:package报错,是因为maven-jar-plugin根本没有package这个目标,它的正确目标是jar,你可以直接执行mvn jar:jar来单独调用这个目标,但这样只会生成jar包,不会执行compile、test等前置的生命周期阶段,所以通常我们还是用mvn package来完成完整的打包流程。
内容的提问来源于stack exchange,提问作者smith

