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.圖形介面:
填寫必要資訊: