Maven 命令行打包 和 pom.xml的常用配置詳解
maven 命令行打包
mvn -v, --show-version
現(xiàn)在最新的maven版本是 3.6,我這里用的還是 2017 年下載的 3.1.1 版本(雖然有點(diǎn)過時(shí),但是大版本不變,指令基本一樣)


mvn -h, --help
使用 help 命令可以看到 maven 命令的幫助文檔,下面主要介紹兩個(gè)常用的指令 —— D 和 P。

mvn -D, --define <arg>
mvn -DpropertyName=propertyValue clean package 可以用來臨時(shí)定義屬性和值。如果 pom.xml 中已經(jīng)有該屬性,那么會(huì)替換掉 pom.xml 中的值。
如果需要定義多個(gè)變量,可以用空格分隔
mvn -DpropA=valueA -DpropB=valueB -DpropC=valueC clean package
當(dāng)然這個(gè)屬性也可以直接在 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> 標(biāo)簽中指定 <id> 才能用 -P 使之生效。
假如 pom.xml 如下:
<project> ... <profiles> <profile> <id>test</id> ... </profile> <profile> <id>dev</id> ... </profile> <profile> <id>prod</id> ... </profile> </profiles> ... </project>
那么打包時(shí)執(zhí)行 mvn clean package -P prod 將只激活 prod 環(huán)境的 profile 配置(也就是說此時(shí) test 和 dev 的配置不會(huì)生效)
mvn package 與 mvn install 的區(qū)別
| 命令 | 含義 |
|---|---|
| mvn clean | 刪除 target 目錄 |
| mvn package | 把 jar 打到本項(xiàng)目的 target 目錄下 |
| mvn install | 把 jar 打到本項(xiàng)目的 target 目錄下,之后再將它安裝到本地的 maven 倉庫中 |
mvn 打包插件的執(zhí)行順序
我這里用的是 maven 3.1.1 打包 android 項(xiàng)目
--- 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 | 復(fù)制和替換文件 |
| maven-compiler-plugin | 編譯所有源文件生成class文件至target\classes目錄下 |
| maven-surefire-plugin | 運(yùn)行測試用例 |
| maven-jar-plugin | 對編譯后生成的文件進(jìn)行打包 包名稱默認(rèn)為:artifactId-version-SNAPSHOT.jar,保存在 target 目錄下 |
| maven-javadoc-plugin | 生成文檔 |
| android-maven-plugin | 生成、混淆 Android 的類文件(apklib是和aar差不多,都是將類和資源打在一起) |
實(shí)戰(zhàn)
案例一
使用 mvn 打包,并跳過測試,然后生成文檔,使用 dev 配置
@echo off mvn clean package -Dmaven.test.skip=true javadoc:javadoc -Pdev
案例二
將模塊A生成的 jar,復(fù)制到模塊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
默認(rèn)情況下,cmd 的命令發(fā)起調(diào)用后就立即返回了。而 CALL 是一個(gè)調(diào)用外部批處理程序的指令,類似于函數(shù)調(diào)用的執(zhí)行邏輯,它會(huì)一直等到函數(shù)執(zhí)行結(jié)束才返回。
pom.xml的常用配置
denpendencyManagement 與 pluginManagement
denpendencyManagement是用于管理項(xiàng)目jar包依賴,pluginManagement是用于管理plugin。
它們的作用是列出依賴的jar包或者plugin包,讓子pom來決定是否引用。
對不同的配置賦予不同的屬性
<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 元素用來指定激活條件。當(dāng)沒有指定條件,然后指定 activeByDefault 為 true 的時(shí)候,就表示沒有指明 profile 的情況下默認(rèn)激活。也就是說 mvn package 將使用 dev 的配置,而 mvn package -P prod 的時(shí)候使用的才是 prod 的配置。
根據(jù)不同配置使用不同的源文件
<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>
然后在 profiles/dev 目錄下新建 java 文件
(略)
private boolean isDebugEnable = ${debug.enable}
(略)
執(zhí)行打包命令 mvn clean package -DskipTests -Pdev,就可以看到 /profiles/dev 目錄下的 java 文件全部被復(fù)制到了 /src/com/companyName/global 目錄下了,并且 isDebugEnable 的值也被替換了。
配置項(xiàng)說明:
parse 用來指明具體在 maven 的哪個(gè)生命周期執(zhí)行該任務(wù)
maven 的生命周期表
| 生命周期階段 | 描述 |
|---|---|
| validate | 驗(yàn)證項(xiàng)目是否正確,并且所有必要的信息可用于完成構(gòu)建過程 |
| initialize | 建立初始化狀態(tài),例如設(shè)置屬性 |
| generate-sources | 產(chǎn)生任何的源代碼包含在編譯階段 |
| process-sources | 處理源代碼,例如,過濾器值 |
| generate-resources | 包含在包中產(chǎn)生的資源 |
| process-resources | 復(fù)制和處理資源到目標(biāo)目錄,準(zhǔn)備打包階段 |
| compile | 編譯該項(xiàng)目的源代碼 |
| process-classes | 從編譯生成的文件提交處理,例如:Java類的字節(jié)碼增強(qiáng)/優(yōu)化 |
| generate-test-sources | 生成任何測試的源代碼包含在編譯階段 |
| process-test-sources | 處理測試源代碼,例如,過濾器任何值 |
| test-compile | 編譯測試源代碼到測試目標(biāo)目錄 |
| process-test-classes | 處理測試代碼文件編譯生成的文件 |
| test | 運(yùn)行測試使用合適的單元測試框架(JUnit) |
| prepare-package | 執(zhí)行必要的任何操作的實(shí)際打包之前準(zhǔn)備一個(gè)包 |
| package | 提取編譯后的代碼,并在其分發(fā)格式打包,如JAR,WAR或EAR文件 |
| pre-integration-test | 完成執(zhí)行集成測試之前所需操作。例如,設(shè)置所需的環(huán)境 |
| integration-test | 處理并在必要時(shí)部署軟件包到集成測試可以運(yùn)行的環(huán)境 |
| pre-integration-test | 完成集成測試已全部執(zhí)行后所需操作。例如,清理環(huán)境 |
| verify | 運(yùn)行任何檢查,驗(yàn)證包是有效的,符合質(zhì)量審核規(guī)定 |
| install | 將包安裝到本地存儲(chǔ)庫,它可以用作當(dāng)?shù)仄渌?xiàng)目的依賴 |
| deploy | 復(fù)制最終的包到遠(yuǎn)程倉庫與其他開發(fā)者和項(xiàng)目共享 |
inherited 用來指明 execution 是否傳遞到子 pom.xml 里
filtering屬性用來表示資源文件中的 “EL表達(dá)式占位符” 是否需要被替換,true為需要替換
到此這篇關(guān)于Maven 命令行打包 和 pom.xml的常用配置詳解的文章就介紹到這了,更多相關(guān)Maven 命令行打包和pom.xml配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springcloud Config支持本地配置文件的方法示例
這篇文章主要介紹了Springcloud Config支持本地配置文件的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
SpringBoot任意版本集成Swagger各種版本的操作指南
在學(xué)習(xí)Swagger生成API文檔的時(shí)候經(jīng)常會(huì)遇到問題,而目前市面上大部分技術(shù)分享者的SpringBoot版本并沒和我們的同步,導(dǎo)致一些一模一樣的代碼,在我們的項(xiàng)目上卻無法使用,這是一個(gè)經(jīng)常性的問題,本文章就旨在和大家搞定SpringBoot任意版本集成Swagger各種版本2024-07-07
MyBatisPlus3.4.3版自動(dòng)生成代碼的使用過程
這篇文章主要介紹了MyBatisPlus3.4.3版自動(dòng)生成代碼的使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
Java使用@Retryable注解實(shí)現(xiàn)HTTP請求重試
HTTP調(diào)用是Java應(yīng)用與外部API進(jìn)行交互時(shí)重要的訪問方式之一,為了確保在遇到臨時(shí)性問題時(shí)能自動(dòng)重試,我們可以設(shè)計(jì)一個(gè)靈活的重試機(jī)制,在Java中,我們可以通過注解來實(shí)現(xiàn)這一功能,文將介紹如何使用注解@Retryable來實(shí)現(xiàn)HTTP調(diào)用的重試機(jī)制,需要的朋友可以參考下2024-10-10
Maven+Tomcat8 實(shí)現(xiàn)自動(dòng)化部署的方法
本篇文章主要介紹了Maven+Tomcat8 實(shí)現(xiàn)自動(dòng)化部署的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
成功解決IDEA2020 Plugins 連不上、打不開的方法
這篇文章主要介紹了成功解決IDEA2020 Plugins 連不上、打不開的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Spring 使用注解方式進(jìn)行事務(wù)管理配置方式
本篇文章主要介紹了Spring 使用注解方式進(jìn)行事務(wù)管理配置方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
Java數(shù)據(jù)結(jié)構(gòu)之最小堆和最大堆的原理及實(shí)現(xiàn)詳解
在計(jì)算機(jī)科學(xué)中,堆(heap)?的實(shí)現(xiàn)是一種基于樹的特殊的數(shù)據(jù)結(jié)構(gòu),它可以在數(shù)組上構(gòu)建出樹的結(jié)構(gòu)體,并滿足堆的屬性。本文就來和大家詳細(xì)聊聊Java數(shù)據(jù)結(jié)構(gòu)中的堆,感興趣的可以了解一下2022-09-09

