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

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 文件下配置

<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差不多,都是將類和資源打在一起)

實戰

案例一

使用 mvn 打包,並跳過測試,然後生成文檔,使用 dev 配置

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

案例二

將模塊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 是一個調用外部批處理程序的指令,類似於函數調用的執行邏輯,它會一直等到函數執行結束才返回。

pom.xml的常用配置

denpendencyManagement 與 pluginManagement

denpendencyManagement是用於管理項目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 元素用來指定激活條件。當沒有指定條件,然後指定 activeByDefault 爲 true 的時候,就表示沒有指明 profile 的情況下默認激活。也就是說 mvn package 將使用 dev 的配置,而 mvn package -P prod 的時候使用的纔是 prod 的配置。

根據不同配置使用不同的源文件

<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}
	(略)

執行打包命令 mvn clean package -DskipTests -Pdev,就可以看到 /profiles/dev 目錄下的 java 文件全部被複制到了 /src/com/companyName/global 目錄下了,並且 isDebugEnable 的值也被替換了。

配置項說明:

  • parse 用來指明具體在 maven 的哪個生命週期執行該任務

maven 的生命週期表

生命週期階段 描述
validate 驗證項目是否正確,並且所有必要的信息可用於完成構建過程
initialize 建立初始化狀態,例如設置屬性
generate-sources 產生任何的源代碼包含在編譯階段
process-sources 處理源代碼,例如,過濾器值
generate-resources 包含在包中產生的資源
process-resources 複製和處理資源到目標目錄,準備打包階段
compile 編譯該項目的源代碼
process-classes 從編譯生成的文件提交處理,例如:Java類的字節碼增強/優化
generate-test-sources 生成任何測試的源代碼包含在編譯階段
process-test-sources 處理測試源代碼,例如,過濾器任何值
test-compile 編譯測試源代碼到測試目標目錄
process-test-classes 處理測試代碼文件編譯生成的文件
test 運行測試使用合適的單元測試框架(JUnit)
prepare-package 執行必要的任何操作的實際打包之前準備一個包
package 提取編譯後的代碼,並在其分發格式打包,如JAR,WAR或EAR文件
pre-integration-test 完成執行集成測試之前所需操作。例如,設置所需的環境
integration-test 處理並在必要時部署軟件包到集成測試可以運行的環境
pre-integration-test 完成集成測試已全部執行後所需操作。例如,清理環境
verify 運行任何檢查,驗證包是有效的,符合質量審覈規定
install 將包安裝到本地存儲庫,它可以用作當地其他項目的依賴
deploy 複製最終的包到遠程倉庫與其他開發者和項目共享
  • inherited 用來指明 execution 是否傳遞到子 pom.xml 裏
  • filtering屬性用來表示資源文件中的 “EL表達式佔位符” 是否需要被替換,true爲需要替換
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章