mvn -v, --show-version

现在最新的maven版本是 3.6,我这里用的还是 2017 年下载的 3.1.1 版本(虽然有点过时,但是大版本不变,指令基本一样)
Maven 命令行打包
Maven 命令行打包

mvn -h, --help

使用 help 命令可以看到 maven 命令的帮助文档,下面主要介绍两个常用的指令 —— D 和 P。
Maven 命令行打包

mvn -D, --define <arg>

mvn -DpropertyName=propertyValue clean package 可以用来临时定义属性和值。如果 pom.xml 中已经有该属性,那么会替换掉 pom.xml 中的值。

如果需要定义多个变量,可以用空格分隔
mvn -DpropA=valueA -DpropB=valueB -DpropC=valueC clean package

当然这个属性也可以直接在 pom.xml 文件下配置

<project>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<android.sdk.path>C:\software\android\sdk</android.sdk.path>
		<maven.test.skip>true</maven.test.skip>
		<maven.javadoc.skip>true</maven.javadoc.skip>
	</properties>
</project>

mvn -P, --activate-profiles <arg>

P 表示 Profiles 配置文件,需要在 <profile> 标签中指定 <id> 才能用 -P 使之生效。

假如 pom.xml 如下:

<project>
	...
	<profiles>
		<profile>
			<id>test</id>
			...
		</profile>
		<profile>
			<id>dev</id>
			...
		</profile>
		<profile>
			<id>prod</id>
			...
		</profile>
	</profiles>
	...
</project>

那么打包时执行 mvn clean package -P prod 将只** prod 环境的 profile 配置(也就是说此时 test 和 dev 的配置不会生效)

mvn package 与 mvn install 的区别

命令 含义
mvn clean 删除 target 目录
mvn package 把 jar 打到本项目的 target 目录下
mvn install 把 jar 打到本项目的 target 目录下,之后再将它安装到本地的 maven 仓库中

mvn 打包插件的执行顺序

我这里用的是 maven 3.1.1 打包 android 项目

--- maven-clean-plugin:2.5:clean (default-clean)
--- maven-install-plugin:2.4:install (default-install)
>>> maven-javadoc-plugin:2.6.1:javadoc (default-cli)
<<< maven-javadoc-plugin:2.6.1:javadoc (default-cli)
---  maven-javadoc-plugin:2.6.1:javadoc (default-cli)
--------------------------------------------------------------
--- maven-clean-plugin:2.5:clean (default-clean)
--- maven-resources-plugin:2.6:copy-resources (copy-src)
--- android-maven-plugin:3.8.0:generate-sources (default-generate-sources)
--- maven-resources-plugin:2.6:copy-resources (default-resources)
--- maven-compiler-plugin:2.3.1:compile (default-compile)
--- android-maven-plugin:3.8.0:proguard (default-proguard)
--- maven-resources-plugin:2.6:testResources (default-testResources)
--- maven-compiler-plugin:2.3.1:testCompile (default-testCompile)
--- maven-surefire-plugin:2.14:test (default-test)
--- maven-jar-plugin:2.6:jar (default-jar)
--- android-maven-plugin:3.8.0:apklib (default-apklib)
--- maven-install-plugin:2.3.1:install-file (custom-install)
--- maven-antrun-plugin:1.3:run (to-lib-directory)
>>> maven-javadoc-plugin:2.9:javadoc (default-cli)
--- maven-resources-plugin:2.6:copy-resources (copy-src)
--- android-maven-plugin:3.8.0:generate-sources (default-generate-sources)
<<< maven-javadoc-plugin:2.9:javadoc (default-cli)
---  maven-javadoc-plugin:2.9:javadoc (default-cli)

插件说明

插件 说明
maven-clean-plugin 删除已有target目录
maven-resources-plugin 复制和替换文件
maven-compiler-plugin 编译所有源文件生成class文件至target\classes目录下
maven-surefire-plugin 运行测试用例
maven-jar-plugin 对编译后生成的文件进行打包
包名称默认为:artifactId-version-SNAPSHOT.jar,保存在 target 目录下
maven-javadoc-plugin 生成文档
android-maven-plugin 生成、混淆 Android 的类文件(apklib是和aar差不多,都是将类和资源打在一起)

实战 1

使用 mvn 打包,并跳过测试,然后生成文档,使用 dev 配置

@echo off
mvn clean package -Dmaven.test.skip=true javadoc:javadoc -Pdev

实战 2

将模块A生成的 jar,复制到模块B的 libs 目录下。
安装模块到 maven 仓库。

@echo off
copy /y "moduleA/target/target.jar" "moduleB/libs/baseA.jar"
call mvn install:install-file -Dfile=baseA.jar -DgroupId=com.example -DartifactId=baseA -Dversion=1.0.1 -Dpackaging=jar

默认情况下,cmd 的命令发起调用后就立即返回了。而 CALL 是一个调用外部批处理程序的指令,类似于函数调用的执行逻辑,它会一直等到函数执行结束才返回。

相关文章: