Maven 命令行打包 和 pom.xml的常用配置

maven 命令行打包

mvn -v, --show-version

現(xiàn)在最新的maven版本是 3.6,我這里用的還是 2017 年下載的 3.1.1 版本(雖然有點(diǎn)過(guò)時(shí),但是大版本不變,指令基本一樣)


image.png

image.png

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


image.png

mvn -D, --define <arg>
mvn -DpropertyName=propertyValue clean package 可以用來(lái)臨時(shí)定義屬性和值。如果 pom.xml 中已經(jīng)有該屬性,那么會(huì)替換掉 pom.xml 中的值。

如果需要定義多個(gè)變量,可以用空格分隔
mvn -DpropA=valueA -DpropB=valueB -DpropC=valueC clean package

當(dāng)然這個(gè)屬性也可以直接在 pom.xml 文件下配置

    <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 如下:

    ...
    <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 配置(也就是說(shuō)此時(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 倉(cāng)庫(kù)中

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)

插件說(shuō)明

插件 說(shuō)明
maven-clean-plugin 刪除已有target目錄
maven-resources-plugin 復(fù)制和替換文件
maven-compiler-plugin 編譯所有源文件生成class文件至target\classes目錄下
maven-surefire-plugin 運(yùn)行測(cè)試用例
maven-jar-plugin 對(duì)編譯后生成的文件進(jìn)行打包,包名稱默認(rèn)為:artifactId-version-SNAPSHOT.jar,保存在 target 目錄下
maven-javadoc-plugin 生成文檔
android-maven-plugin 生成、混淆 Android 的類(lèi)文件(apklib是和aar差不多,都是將類(lèi)和資源打在一起)

實(shí)戰(zhàn)

案例一

使用 mvn 打包,并跳過(guò)測(cè)試,然后生成文檔,使用 dev 配置

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

案例二
將模塊A生成的 jar,復(fù)制到模塊B的 libs 目錄下。
安裝模塊到 maven 倉(cāng)庫(kù)。

@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)用外部批處理程序的指令,類(lèi)似于函數(shù)調(diào)用的執(zhí)行邏輯,它會(huì)一直等到函數(shù)執(zhí)行結(jié)束才返回。

pom.xml的常用配置

denpendencyManagement 與 pluginManagement

denpendencyManagement是用于管理項(xiàng)目jar包依賴,pluginManagement是用于管理plugin。
它們的作用是列出依賴的jar包或者plugin包,讓子pom來(lái)決定是否引用。

對(duì)不同的配置賦予不同的屬性

    <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 元素用來(lái)指定激活條件。當(dāng)沒(méi)有指定條件,然后指定 activeByDefault 為 true 的時(shí)候,就表示沒(méi)有指明 profile 的情況下默認(rèn)激活。也就是說(shuō) 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)說(shuō)明:

parse 用來(lái)指明具體在 maven 的哪個(gè)生命周期執(zhí)行該任務(wù)

<center>maven 的生命周期表</center>

生命周期階段 描述
validate 驗(yàn)證項(xiàng)目是否正確,并且所有必要的信息可用于完成構(gòu)建過(guò)程
initialize 建立初始化狀態(tài),例如設(shè)置屬性
generate-sources 產(chǎn)生任何的源代碼包含在編譯階段
process-sources 處理源代碼,例如,過(guò)濾器值
generate-resources 包含在包中產(chǎn)生的資源
process-resources 復(fù)制和處理資源到目標(biāo)目錄,準(zhǔn)備打包階段
compile 編譯該項(xiàng)目的源代碼
process-classes 從編譯生成的文件提交處理,例如:Java類(lèi)的字節(jié)碼增強(qiáng)/優(yōu)化
generate-test-sources 生成任何測(cè)試的源代碼包含在編譯階段
process-test-sources 處理測(cè)試源代碼,例如,過(guò)濾器任何值
test-compile 編譯測(cè)試源代碼到測(cè)試目標(biāo)目錄
process-test-classes 處理測(cè)試代碼文件編譯生成的文件
test 運(yùn)行測(cè)試使用合適的單元測(cè)試框架(JUnit)
prepare-package 執(zhí)行必要的任何操作的實(shí)際打包之前準(zhǔn)備一個(gè)包
package 提取編譯后的代碼,并在其分發(fā)格式打包,如JAR,WAR或EAR文件
pre-integration-test 完成執(zhí)行集成測(cè)試之前所需操作。例如,設(shè)置所需的環(huán)境
integration-test 處理并在必要時(shí)部署軟件包到集成測(cè)試可以運(yùn)行的環(huán)境
pre-integration-test 完成集成測(cè)試已全部執(zhí)行后所需操作。例如,清理環(huán)境
verify 運(yùn)行任何檢查,驗(yàn)證包是有效的,符合質(zhì)量審核規(guī)定
install 將包安裝到本地存儲(chǔ)庫(kù),它可以用作當(dāng)?shù)仄渌?xiàng)目的依賴
deploy 復(fù)制最終的包到遠(yuǎn)程倉(cāng)庫(kù)與其他開(kāi)發(fā)者和項(xiàng)目共享

inherited 用來(lái)指明 execution 是否傳遞到子 pom.xml 里
filtering屬性用來(lái)表示資源文件中的 “EL表達(dá)式占位符” 是否需要被替換,true為需要替換

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容