理解maven命令package、install、deploy的联系与区别

我们在用maven构建java项目时,最常用的打包命令有mvn package、mvn install、mvn deploy,这三个命令都可完成打jar包或war(当然也可以是其它形式的包)的功能。

但这三个命令还是有区别的,可以从执行这三个命令的输出结果来分析看,各自所执行的maven的生命周期不同。

通过执行这三个命令的输出结果我们可以看出三者的区别在于包函的maven生命的阶段和执行目标(goal)不同。

maven生命周期(Lifecycle)由各个阶段组成,每个阶段由maven的插件plugin来执行完成。

生命周期(Lifecycle)主要包括clean、resources、complie、install、pacakge、testResources、testCompile、deploy等,其中带test开头的都是用业编译测试代码或运行单元测试用例的。

仔细查看三个命令执行输出的结果,可以发现,

  • mvn clean package 依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。
  • mvn clean install 依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等 8个阶段。
  • mvn clean deploy 依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。

由上面的分析可知主要区别如下,

  • package 命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
  • install 命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
  • deploy 命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

mvn clean install 与 mvn install 的区别

mvn install后,新改的内容不生效,一定要使用mvn clean install 才生效

我们执行mvn install的时候会先执行mvn package,maven就是通过这个生命周期来根据用户配置,进行打包(war、jar或者其他),这会在每个工程 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">

  ...
  <packaging>war</packaging>
  ...
</project>

这里指定package的时候打成一个war包,改成jar,就会被打成jar包。

我们看jar形式的情况,mvn package 会调用 maven-jar-plugin 这个插件进行打包。

下面我们做一些实验来看这个插件打包时的情况

  • 1. 修改target目录下打好的jar包中class以及配置文件的内容,在运行命令mvn package,结果target包中的内容没有被覆盖。
  • 2. 修改源代码中的内容,再运行命令mvn package,结果target包中的内容被覆盖了,产生了新的包。
  • 3. 修改target目录下打好的jar包中的内容,运行命令mvn package -Djar.forceCreation,这个参数应该是强制创建jar包,所以结果target中的jar包内容被覆盖了,产生了新的jar包。

总结

  • 1.  jar包不存在(其实就是mvn clean的效果)
  • 2.  理论上来讲不做mvn clean 得到的jar包应该是最新的,除非其他方式修改jar包中的内容而不修改源代码。
  • 3.  平时可以用mvn install,而不进行chean节省时间(如果你觉得节省时间多的话),但最保险还是用 mvn clean install 生成最新的jar包或其他包
  • 4.  不想用mvn clean又想保证jar包最新,建议添加 -Djar.forceCreation 参数

 

posted @ 2019-06-28 14:27  以德为先  阅读(7036)  评论(0编辑  收藏  举报