Maven本质上是一个插件框架,并不执行任何具体的构建任务,它把所有这些任务都交给插件来完成。
作为开发利器的maven,为我们提供了十分丰富的命令,了解maven的命令行操作并熟练运用常见的maven命令还是十分必要的,即使譬如IDEA等工具给我提供了图形界面化工具,但其底层还是依靠maven命令来驱动的。因此,知其然,知其所以然,方能百战不殆。
该命令的意思是:执行plugin-name插件的goal-name目标。
用户可以通过两种方式调用Maven插件的目标:
将插件目标与生命周期阶段lifecycle phase绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。直接在命令行指定要执行的插件目标,例如mvnarchetype:generate就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。注意:运行maven命令的时候,首先需要定位到maven项目的目录,也就是项目的pom.xml文件所在的目录。否则,必以通过参数来指定项目的目录。
上面列举的只是比较通用的命令,其实很多命令都可以携带参数以执行更精准的任务。 Maven命令可携带的参数类型如下:
1. -D 传入属性参数
比如命令:mvn package -Dmaven.test.skip=true 以-D开头,将maven.test.skip的值设为true,就是告诉maven打包的时候跳过单元测试。同理,mvn deploy-Dmaven.test.skip=true代表部署项目并跳过单元测试。
2. -P 使用指定的Profile配置
比如项目开发需要有多个环境,一般为开发,测试,预发,正式4个环境,在pom.xml中的配置如下:
<profiles> <profile> <id>dev</id> <properties> <env>dev</env> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>qa</id> <properties> <env>qa</env> </properties> </profile> <profile> <id>pre</id> <properties> <env>pre</env> </properties> </profile> <profile> <id>prod</id> <properties> <env>prod</env> </properties> </profile> </profiles> ...... <build> <filters> <filter>config/${env}.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> ...... </build>profiles定义了各个环境的变量id,filters中定义了变量配置文件的地址,其中地址中的环境变量就是上面profile中定义的值,resources中是定义哪些目录下的文件会被配置文件中定义的变量替换。
通过maven可以实现按不同环境进行打包部署,命令为:
mvn package -P dev其中dev为环境的变量id,代表使用Id为dev的profile。
3. -e 显示maven运行出错的信息
4. -o 离线执行命令,即不去远程仓库更新包
5. -X 显示maven允许的debug信息
6. -U 强制去远程更新snapshot的插件或依赖,默认每天只更新一次
maven命令实例
下面结合几个实例来看看maven命令的使用方法。
archetype:create & archetype:generatearchetype是原型的意思,maven可以根据各种原型来快速创建一个maven项目。
archetype:create是maven 3.0.5之前创建项目的命令,例如创建一个普通的Java项目:
mvn archetype:create -DgroupId=packageName -DartifactId=projectName -Dversion=1.0.0-SNAPSHOT后面的三个参数用于指定项目的groupId、artifactId以及version。
创建Maven的Web项目:
mvn archetype:create -DgroupId=packageName -DartifactId=projectName -DarchetypeArtifactId=maven-archetype-webapparchetypeArtifactId参数用于指定使用哪个maven原型,这里使用的是maven-archetype-webapp,maven会按照web应用的目录结构生成项目。
需要注意的是,在maven 3.0.5之后,archetype:create命令不在使用,取而代之的是archetype:generate命令。
都要选择在运行的项目的pom文件目录
关于-N
-N,--non-recursive Do not recurse into sub-projects
意思是,不递归到子项目(子模块)。
举例:
一个父项目下Father面有3个子项目A、B、C,都生成jar包,则有Father.jar、A.jar、B.jar、C.jar; 这个时候A项目依赖了B、C项目。
此时如果使用mvn clean install -N,则只会把Father.jar安装到本地仓库(~/.m2/repository), 而不会安装其他三个包
造成的问题是,如果你此时使用如下命令拷贝依赖包,则会报错:说找不到依赖包B.jar/C.jar
mvn dependency:copy-dependencies -DoutputDirectory=$WORKSPACE/dependencies关于-U
-U,--update-snapshots Forces a check for missing releases and updated snapshots on remote repositories
意思是:强制刷新本地仓库不存在release版和所有的snapshots版本。 对于release版本,本地已经存在,则不会重复下载对于snapshots版本,不管本地是否存在,都会强制刷新,但是刷新并不意味着把jar重新下载一遍。 只下载几个比较小的文件,通过这几个小文件确定本地和远程仓库的版本是否一致,再决定是否下载