1. 程式人生 > >Maven-進階

Maven-進階

1.依賴管理Dependency Management

1.1.依賴管理的主要配置
在這裡插入圖片描述
座標:groupId、artifactId、version
type:依賴的型別,預設值就jar。
bundle:打包不是maven標準的打包,也能湊合用,但不推薦在這裡插入圖片描述
exclusions:排除某依賴
目標:要將log4j中不需要的jar排除掉。
在這裡插入圖片描述操作右鍵:
在這裡插入圖片描述
操作右鍵:
在這裡插入圖片描述
儲存後:
在這裡插入圖片描述在這裡插入圖片描述
scope:依賴範圍
在這裡插入圖片描述

在這裡插入圖片描述
compile:編譯,打包、測試都需要。絕大多數jar都是如此,也是預設值。
provided:編譯需要,打包不需要。例如servlet、jsp的jar。

在這裡插入圖片描述

1.2.傳遞性依賴的問題

在這裡插入圖片描述
引發傳遞性依賴的問題,即:同時引用了的依賴jar包衝突。如:通過引入struts2和spring整合jar:
在這裡插入圖片描述在這裡插入圖片描述 jar的版本衝突出現了!

Maven的依賴調節策略:
在這裡插入圖片描述
舉例:X是A的傳遞性依賴
1)
A->B->C-D-X(1.6)
A->D-X(2.0)
根據第一原則:2.0會引入進來!
2)
A->D-X(2.0)
A->D-X(3.0)
當第一原則失效,則遵循第二原則。
解決版本衝突:
1)優先遵循第二原則,先宣告先進來。
這裡優先將spring放到前面
2)第一原則:直接依賴,路徑最短

3)我們一般優先使用依賴調節策略,當依賴調節策略也不能解決的情況下,可以鎖定版本。但會打破依賴調節策略。
例如:spring core的版本就是要用3.05
在這裡插入圖片描述

在這裡插入圖片描述
4)如果某個jar不需要(按道理說,maven自動識別同樣型別的jar,引入一個版本。但有時候,兩個jar差距太大,識別不出來。)可以排除一個版本。(上節知識)
在這裡插入圖片描述
1.3.自定義屬性-統一版本維護
在maven中,可以自定義屬性,為了在maven的環境中使用(引用)。
自定義屬性應用中,可以做統一版本維護。
問題:當引入過多的依賴的時候,相同型別的依賴版本一般要統一,但單獨維護很麻煩。

在這裡插入圖片描述

maven預設是1.5的編譯。
在這裡插入圖片描述
解決方案:
修改編譯版本為1.7:

<build>
  	<plugins>
  		<plugin>
  			<groupId>org.apache.maven.plugins</groupId>
  			<artifactId>maven-compiler-plugin</artifactId>
  			<version>3.1</version>
  			<configuration>
  				<source>1.7</source>
  				<target>1.7</target>
  			</configuration>
  		</plugin>
  	</plugins>
  </build>

需要按照pom配置去更新專案:
在這裡插入圖片描述

2.生命週期

在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述
不管哪套生命週期,都是獨立的。但同一套生命週期執行的順序是從上到下的,例如:
執行mvn package,那麼會自動執行package之前的所有的過程。

擴充套件:可以同時執行兩套生命週期(組合命令)
mvn clean package

在這裡插入圖片描述
3.外掛(Plugin)

外掛是maven的功能的組成!
主要用來控制生命週期、tomcat執行等等。
倉庫中存放是構件,構件有兩種:jar相關和外掛。
如果外掛本地倉庫沒有,則會自動到遠端倉庫下載。

3.1.編譯maven-compiler-plugin

maven-compiler-plugin:3.1
負責編譯。
改變編譯版本,預設是maven的編譯版本是1.5.
maven的外掛要改變預設值,的方法:通過自定義pom的配置來覆蓋預設配置。
在這裡插入圖片描述

<build>
	<plugins>
		<!-- 編譯外掛 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.1</version>
			<configuration>
				<!-- 開發時原始碼編譯版本 -->
				<source>1.7</source>
				<!-- 打包編譯到target目錄時的版本  -->
				<target>1.7</target>
				<!-- 編譯時的編碼,預設是iso8859-1 -->
				<encoding>utf-8</encoding>
			</configuration>
		</plugin>
	</plugins>
</build>

要讓配置生效,需要更新專案(讓專案根據配置來重新構建):
在這裡插入圖片描述

3.2.測試
編寫測試用例:
在這裡插入圖片描述
讓所有的用例都跑一下:mvn test
在這裡插入圖片描述

1)中文亂碼問題

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<!-- 控制檯中文編碼問題 -->
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>

3.3.Tomcat

tomcat-maven-plugin:1.1
預設埠是8080,編碼是iso8859-1
目標;要修改埠和編碼
在這裡插入圖片描述

<plugin>
			<groupId>org.codehaus.mojo</groupId>
			<artifactId>tomcat-maven-plugin</artifactId>
			<version>1.1</version>
			<configuration>
				<!-- 埠 -->
				<port>9090</port>
				<!-- 編碼 -->
				<charset>utf-8</charset>
			</configuration>
		</plugin>

3.4.其他

maven的外掛有內建的,和外接的外掛。
內建外掛:根據groupId來識別的,只能識別兩個:org.codehaus.mojo、org.apache.maven.plugins
直接使用即可。比如編譯,打包,內建tomcat。
外接外掛(第三方):組id不是上面這兩個
需要宣告再用。
比如tocmat7外掛
在這裡插入圖片描述在這裡插入圖片描述解決方案:宣告引入外掛:
在這裡插入圖片描述 注:【自己】

4.多模組和聚合

4.1.概念
多模組:將一個專案分解為幾個小的專案,在父專案中統一管理子專案的功能,通過父專案module管理子專案
聚合(繼承):子專案繼承父專案,複用父專案中的內容(jar、配置等),通過子專案中parent標籤繼承。
兩者是獨立的,但通常一起使用。多模組是從上到下管理子專案的,繼承從下到上繼承複用父專案的。

4.2.多模組和繼承的構建
第一步:先建立父專案
在這裡插入圖片描述
專案型別選擇pom:
在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述
第二步;:建立子專案(兩個java專案)
在這裡插入圖片描述
在這裡插入圖片描述
提示:父專案必須是pom型別的,否則報錯:

分析配置程式碼:
父專案:
在這裡插入圖片描述
子專案:

在這裡插入圖片描述
按照上面的步驟,再建立子專案:

分析父專案:
在這裡插入圖片描述
子專案:
在這裡插入圖片描述

4.3.多模組和繼承的操作
目標:測試向下管理和向上繼承。
向下管理
父專案統一管理操作子專案
需求:對子專案打包操作。
只需要在父專案上 mvn package即可,子專案自動打包。{注:使用Eclipse Maven外掛[Run As]-[Maven build]時多輸入了mvn命令
,因為Eclipse Maven外掛已經幫你加上了mvn的命令字首,此時只需package即可,否則報錯誤LifecyclePhaseNotFoundException,Unknown lifecycle phase “mvn”. You must specify a valid lifecycle}
在這裡插入圖片描述
向上繼承
子專案可以複用父專案的東東
需求:所有子專案都需要junit包,
只需要在父專案中引入即可。
在這裡插入圖片描述
為什麼要分解??
因為有時候專案本身要複用,因此可以將一個專案中模組,抽取出來一個單獨的專案,多個專案複用該專案。
如何分解?
根據業務功能分解。業務功能模組是複用的。比如發簡訊的模組抽取出來單獨專案。
根據開發層來分解。根據三層架構來分解。比如domain多個專案複用,則可以抽取出來。

5.全域性Settings的配置

5.1.私服的客戶端配置使用
比如阿里雲的私服:

<mirror>
    <id>aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun de sifu</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

5.2.自定義屬性覆蓋
問題:之前maven預設編譯版本是1.5,以後建立的專案都預設是1.5,雖然可以通過專案中的pom.xml去覆蓋,但麻煩。
在全域性覆蓋!

<profile>
		<id>jdk-1.7</id>
		<activation>
			<activeByDefault>true</activeByDefault>
			<jdk>1.7</jdk>
		</activation>
		<properties>
			<!--prevent "[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!-->
			<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
			<!--Handle special characters in site-->
			<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
			<!--set up Maven so it will compile with a target and source JVM of my choice-->
			<maven.compiler.source>1.7</maven.compiler.source>
			<maven.compiler.target>1.7</maven.compiler.target>
			<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
		</properties>
	</profile>

6.第三方構件安裝到本地倉庫

問題:Oracle在中央倉庫中沒有構件,因此無法下載下來。
解決方案:手動安裝
1.命令列安裝(瞭解):
*在你下載後的 jar 的所在目錄下開啟命令視窗,然後輸入如下命令:

mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=1.0 -Dpackaging=jar -Dfile=ojdbc6.jar*

2.圖形介面:
在這裡插入圖片描述在這裡插入圖片描述
填寫必要資訊:
在這裡插入圖片描述