maven 命令行打包
mvn -v, --show-version
现在最新的maven版本是 3.6,我这里用的还是 2017 年下载的 3.1.1 版本(虽然有点过时,但是大版本不变,指令基本一样)
mvn -h, --help
使用 help 命令可以看到 maven 命令的帮助文档,下面主要介绍两个常用的指令 —— D 和 P。
mvn -D, --define <arg>
mvn -DpropertyName=propertyValue clean package 可以用来临时定义属性和值。如果 pom.xml 中已经有该属性,那么会替换掉 pom.xml 中的值。
如果需要定义多个变量,可以用空格分隔mvn -DpropA=valueA -DpropB=valueB -DpropC=valueC clean package
当然这个属性也可以直接在 pom.xml 文件下配置
?| 1 2 3 4 5 6 7 8 | <project> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <android.sdk.path>C:softwareandroidsdk</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 如下:
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <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 项目
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | --- 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文件至targetclasses目录下 |
| maven-surefire-plugin | 运行测试用例 |
| maven-jar-plugin | 对编译后生成的文件进行打包 包名称默认为:artifactId-version-SNAPSHOT.jar,保存在 target 目录下 |
| maven-javadoc-plugin | 生成文档 |
| android-maven-plugin | 生成、混淆 Android 的类文件(apklib是和aar差不多,都是将类和资源打在一起) |
实战
案例一
使用 mvn 打包,并跳过测试,然后生成文档,使用 dev 配置
?| 1 2 | @echo offmvn clean package -Dmaven.test.skip=true javadoc:javadoc -Pdev |
案例二
将模块A生成的 jar,复制到模块B的 libs 目录下。
安装模块到 maven 仓库。
| 1 2 3 | @echo offcopy /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 是一个调用外部批处理程序的指令,类似于函数调用的执行逻辑,它会一直等到函数执行结束才返回。
pom.xml的常用配置
denpendencyManagement 与 pluginManagement
denpendencyManagement是用于管理项目jar包依赖,pluginManagement是用于管理plugin。
它们的作用是列出依赖的jar包或者plugin包,让子pom来决定是否引用。
对不同的配置赋予不同的属性
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <profiles> <profile> <id>dev</id> <properties> <mysql.url>http://localhost:3306</mysql.url> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>prod</id> <properties> <mysql.url>http://192.168.1.10:3306</mysql.url> </properties> </profile></profiles> |
activation 元素用来指定激活条件。当没有指定条件,然后指定 activeByDefault 为 true 的时候,就表示没有指明 profile 的情况下默认激活。也就是说 mvn package 将使用 dev 的配置,而 mvn package -P prod 的时候使用的才是 prod 的配置。
根据不同配置使用不同的源文件
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <profiles> <profile> <id>dev</id> <properties> <debug.enable>true</debug.enable> </properties> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>copy-id</id> <goals> <goal>copy-goal</goal> </goals> <phase>validate</phase> <configuration> <outputDirectory>${basedir}/src/com/companyName/global/</outputDirectory> <resources> <directory>${basedir}/profiles/dev/</directory> <filtering>true</filtering> <includes> <include>***.java</include> </includes> </resources> </configuration> </execution> </executions> </plugin> </profile></profiles>area> |

