Maven項目詳解

maven的概念模型

Maven是Apache下的一個開源項目,它是一個項目管理工具,它用於對java項目進行項目構建、依賴管理及項目信息管理。當前使用Maven的項目在持續增長。
Maven包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命週期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命週期階段(phase)中插件(plugin)目標(goal)的邏輯。

在這裏插入圖片描述
1.Pom項目對象模型
創建一個maven項目,每一個maven項目中都有一個pom.xml文件,在這個文件中我們就可以配置相關信息
2.依賴管理
通過定義項目所依賴組件的座標由maven進行依賴管理。
比如:項目依賴struts2.3.24,通過在pom.xml中定義依賴即可將struts2的jar包自動加入工程:
3.maven項目生命週期
在這裏插入圖片描述

Maven倉庫

關於倉庫的種類:
1.本地倉庫
由我們自己配置的一個倉庫,從遠程倉庫中下載下的jar,都會存儲到本地倉庫中。
2.遠程倉庫
 網絡上的其它倉庫
3.中央倉庫:
在maven環境內部內置一個遠程倉庫地址http://repo1.maven.org/maven2 ,它是中央倉庫,服務於整個互聯網,它是由Maven自己維護,裏面有大量的常用類庫,幷包含了世界上大部分流行的開源項目構件。它本身也是一個遠程倉庫,因爲它是由maven團隊維護

Maven安裝配置

下載網址: http://maven.apache.org/download.cgi
在這裏插入圖片描述
本教程使用3.1.1 版本
在這裏插入圖片描述
解壓不含有中文和空格的目錄
在這裏插入圖片描述

bin目錄 mvn.bat (以run方式運行項目)、 mvnDebug.bat(以debug方式運行項目 )
boot目錄 maven運行需要類加載器 
conf目錄 settings.xml 整個maven工具核心配置文件 
lib目錄 maven運行依賴jar包

環境變量配置

電腦上 安裝JDK1.4 + 版本  (將JAVA_HOME/bin 配置環境變量path )
1.在環境變量中創建一個MAVEN_HOME配置的是D:\apache-maven-3.3.9
2.在環境變量中path配置  %MAVEN_HOME%\bin

在這裏插入圖片描述
將 %MAVEN_HOME%\bin 加入環境變量 path
在這裏插入圖片描述
通過 mvn -v命令檢查 配置是否成功
在這裏插入圖片描述

Maven倉庫配置(本地倉庫)

本地倉庫是用來存放聯網下載maven的插件和jar包,maven本地倉庫有的jar不再從互聯網下載,所以本地倉庫相當於一個緩存。
本地倉庫有一個默認位置:${user.dir}/.m2/repository,${user.dir}表示windows用戶目錄,如下

在這裏插入圖片描述

全局本地倉庫:
	我們在maven目錄下的conf下的setttings.xml文件中配置的就是一個全局的本地倉庫
局部本地倉庫:
	可以將settings.xml文件複製到指定的目錄下,來進行配置,它就是一個局部的。

注意:如何在settings.xml文件中指定倉庫位置:
在這裏插入圖片描述

Eclipse整合maven

當前的eclipse的版本是Mars.2 Release (4.5.2),此版本自帶maven插件不用單獨安裝。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
指定settings.xml文件
在這裏插入圖片描述
在這裏插入圖片描述
注意:如果修改了 setting.xml點擊上圖片的“update settings”,對本地倉庫重建索引,點擊“Reindex”。指定它,會幫助我們重建索引。
當我們重建索引後,後續在pom.xml文件中引入依賴,就會爲我們添加提示。
在eclipse中瀏覽倉庫
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

Maven命令介紹

這些命令都是通過插件方式來使用的。
執行編譯命令compile,在eclipse中可以省略mvn,cmd下要加上mvn compile
在這裏插入圖片描述
編譯後 .class文件在 target/classes 下 (這個命令只會對java源程序編譯, 不會編譯測試代碼 , 編譯測試類 mvn test-compile , 編譯後.class 文件在 target\test-classes )
在這裏插入圖片描述
執行清空命令clean,清空target下的編譯好的文件包括打好的包。
Mvn test命令,編譯test包下的文件到target目錄。
Package命令,將項目打包到target下,默認生成jar包名稱 : artifactId-version.jar java項目生成 jar包, web項目生成war包
在這裏插入圖片描述
在這裏插入圖片描述
Install命令:將項目jar或war打包發佈到倉庫---- 安裝到倉庫/groupId/artifactId/version 目錄
測試命令 mvn test 執行所有測試用例方法, 重新編譯

在實際開發中,一般都是在eclipse中來執行maven的命令,我們也可以在命令行執行。
Run as 採用 mvn 命令運行 ,Debug as 採用 mvnDebug 命令調試方式運行(可打斷點)
在這裏插入圖片描述
如:maven clean maven install maven test可以直接執行
在這裏插入圖片描述

maven命令在命令行下執行

Mvn命令在命令行執行,前提必須定位到pom.xml文件所在的路徑下執行需要加mvn,eclipse中不需要加。

maven項目生命週期

在這裏插入圖片描述
Maven clean maven compile maven test……

Maven有三套相互獨立的生命週期這三套生命週期分別是: 
Clean Lifecycle 在進行真正的構建之前進行一些清理工作。 
Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。 
Site Lifecycle 生成項目報告,站點,發佈站點。

執行後邊的生命週期命令,前邊的會自動執行,比如執行package 上面的命令都會自動執行。
在這裏插入圖片描述
1、生命週期clean
clean生命週期每套生命週期都由一組階段(Phase)組成,我們平時在命令行輸入的命令總會對應於一個特定的階段。比如,運行mvn clean ,這個的clean是Clean生命週期的一個階段。有Clean生命週期,也有clean階段。Clean生命週期一共包含了三個階段:
pre-clean 執行一些需要在clean之前完成的工作
clean 移除所有上一次構建生成的文件
post-clean 執行一些需要在clean之後立刻完成的工作
mvn clean 中的clean就是上面的clean,在一個生命週期中,運行某個階段的時候,它之前的所有階段都會被運行,也就是說,mvn clean 等同於 mvn pre-clean clean ,如果我們運行 mvn post-clean ,那麼 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,可以大大簡化命令行的輸入。

2、生命週期default
Default生命週期Default生命週期是Maven生命週期中最重要的一個,絕大部分工作都發生在這個生命週期中:

validate
generate-sources
process-sources
generate-resources
process-resources     複製並處理資源文件,至目標目錄,準備打包。
compile     編譯項目的源代碼。
process-classes
generate-test-sources 
process-test-sources
generate-test-resources
process-test-resources     複製並處理資源文件,至目標測試目錄。
test-compile     編譯測試源代碼。
process-test-classes
test     使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。
prepare-package
package     接受編譯好的代碼,打包成可發佈的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install     將包安裝至本地倉庫,以讓其它項目依賴。
deploy     將最終的包複製到遠程的倉庫,以讓其它開發人員與項目共享。

3、生命週期site
Site生命週期pre-site 執行一些需要在生成站點文檔之前完成的工作
site 生成項目的站點文檔
post-site 執行一些需要在生成站點文檔之後完成的工作,並且爲部署做準備
site-deploy 將生成的站點文檔部署到特定的服務器上
這裏經常用到的是site階段和site-deploy階段,用以生成和發佈Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。

Pom.xml配置文件詳解

pom.xml是Maven項目的核心配置文件,位於每個工程的根目錄,基本配置如下:
<project > :文件的根節點 .
<modelversion > : pom.xml使用的對象模型版本(可以理解爲約束的版本) .
<groupId > :項目名稱,一般寫項目的域名
<artifactId > :模塊名稱,子項目名或模塊名稱
<version > :產品的版本號 . 
<packaging > :打包類型,一般有jar、war、pom 等 
<name > :項目的顯示名,常用於 Maven 生成的文檔。  
<description > :項目描述,常用於 Maven 生成的文檔
<dependencies> :項目依賴構件配置,配置項目依賴構件的座標
<build> :項目構建配置,配置編譯、運行插件等。

第一部分: POM Relationships 關係 
	Coordinates 座標: 在倉庫中唯一標識項目位置三個參數 
	<groupId> 項目名稱
	<artifactId> 模塊名稱
	<version> 版本號
		
	Aggregation 聚合(多模塊) : 將項目分解爲多個不同模塊 
	Inheritance 繼承 : 項目之間繼承,實現POM複用 
	Dependencies 依賴: 項目依賴另一個項目進行編譯或者運行 
第二部分: Project Information 項目信息 
	name :項目名稱 
	desciption: 項目描述
第三部分: Build settings  構建配置
	properties : 配置屬性 
	build :構建項目需要插件配置 
	packaging :打包方式 jar、war、pom (使用繼承)
	reporting : 報表
第四部分: Build Environment 構建環境 (在依賴、構建、運行 生效配置 )
	Distribution Management :版本鎖定 
	Profile : 靈活自定義配置,在特定情況激活 

工程默認編碼
在這裏插入圖片描述
關於maven的tomcat插件使用
可以手動配置端口:maven tomcat插件配置端口
在這裏插入圖片描述
如果使用的tomcat7,可以按如下方案:

<plugin>
	<groupId>org.apache.tomcat.maven</groupId>
	<artifactId>tomcat7-maven-plugin</artifactId>
	<version>2.2</version>			
</plugin>
在eclipse中運行,使用 tomcat7:run就可以

在這裏插入圖片描述
如果使用的是tomcat6,可以按如下方案:

<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>tomcat-maven-plugin</artifactId>
	<version>1.1</version>
</plugin>
運行:tomcat:run

可以同時添加倆個tomcat插件(7\6)
finalname:配置生成的war文件名稱maven_ssh
在這裏插入圖片描述
添加依賴
在pom.xml中定義dependency標籤,導入依賴
在這裏插入圖片描述
在這裏插入圖片描述
通過eclipse導入:
在這裏插入圖片描述
在這裏插入圖片描述

查找座標

方法一:使用網站搜索
http://search.maven.org/
http://mvnrepository.com/
網站搜索示例:
在這裏插入圖片描述
在這裏插入圖片描述
方法二:使用maven插件的索引功能
在這裏插入圖片描述

依賴範圍scope

所謂的依賴範圍,是指我們導入的jar包它的生命週期,簡單說,就是它在什麼情況下可有效
默認:compile
compile:編譯範圍,指A在編譯時依賴B,此範圍爲默認依賴範圍。編譯範圍的依賴會用在編譯、測試、運行,由於運行時需要所以編譯範圍的依賴會被打包。
provided:provided依賴只有在當JDK或者一個容器已提供該依賴之後才使用, provided依賴在編譯和測試時需要,在運行時不需要,比如:servlet api被tomcat容器提供。
runtime:runtime依賴在運行和測試系統的時候需要,但在編譯的時候不需要。比如:jdbc的驅動包。由於運行時需要所以runtime範圍的依賴會被打包。
test:test範圍依賴 在編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用,比如:junit。由於運行時不需要所以test範圍依賴不會被打包。
system:system範圍依賴與provided類似,但是你必須顯式的提供一個對於本地系統中JAR文件的路徑,需要指定systemPath磁盤路徑,system依賴不推薦使用。

在這裏插入圖片描述
測試總結:
默認引入 的jar包 ------- compile 【默認範圍 可以不寫】(編譯、測試、運行 都有效 )
servlet-api 、jsp-api ------- provided (編譯、測試 有效, 運行時無效 防止和tomcat下jar衝突)
jdbc驅動jar包 ---- runtime (測試、運行 有效 )
junit ----- test (測試有效)
依賴範圍由強到弱的順序是:compile>provided>runtime>test

依賴傳遞

A 依賴B、B依賴C,在A中導入B後會自動導入C,C是A的傳遞依賴,如果C依賴D則D也是A的傳遞依賴。爲什麼會出現這種情況,原因在依賴的jar包對應的pom文件中還有依賴的聲明。

依賴傳遞範圍

簡單說,通過依賴傳遞的範圍就可以解決是否要導入依賴的jar包。
縱列:項目A依賴於B的範圍。
橫列:項目B依賴於C的範圍。
框中結果即得出A依賴於C的範圍。
在這裏插入圖片描述

依賴版本衝突問題解決

<!-- struts2-spring-plugin依賴spirng-beans-3.0.5 -->
  	<dependency>
  		<groupId>org.apache.struts</groupId>
  		<artifactId>struts2-spring-plugin</artifactId>
  		<version>2.3.24</version>
  	</dependency>
  	
<!-- spring-context依賴spring-beans-4.2.4 -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-context</artifactId>
  		<version>4.2.4.RELEASE</version>
  	</dependency>
org.apache.struts依賴spirng-beans-3.0.5,spring-context依賴spring-beans-4.2.4,但是發現spirng-beans-3.0.5加入到工程中,而我們希望spring-beans-4.2.4加入工程。
maven自動按照下邊的原則調解依賴標準:
	1.第一聲明者優先原則
		在pom文件中誰先聲明以誰爲準。
	2.路徑近者優先原則
		例如:A-> spirng-beans-4.2.4,A->B-> spirng-beans-3.0.5,則spirng-beans-4.2.4優先

解決方案:
1、排除依賴(開發中應用比較少)
在這裏插入圖片描述
2、鎖定版本(推薦使用)
面對衆多的依賴,有一種方法不用考慮依賴路徑、聲明優化等因素可以採用直接鎖定版本的方法確定依賴構件的版本,此方法在企業開發中常用:
在這裏插入圖片描述
Pom中查看標籤位置規則
在project上點擊f2
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章