1. 程式人生 > 實用技巧 >筆記12:maven專案管理工具

筆記12:maven專案管理工具

maven基礎

  maven開發專案	jar包不在專案中 	配置jar包的座標

---依賴管理:

  maven工程對jar包的管理過程

---maven構建

  專案從編譯、測試、執行、打包、安裝、部署整個過程交給maven進行管理

---尋找jar包

  配置檔案座標 --》系統盤找本地倉庫 --》(本地倉庫未找到並聯網)到中央倉庫(放置了幾乎所有開源的jar包)下載
                               --》(本地倉庫未找到並在同一區域網)遠端倉庫(私服)(jar包沒有則到中央倉庫)^ 

---倉庫三類:【本地】 【遠端(私服)】 【中央倉庫】

---專案部分:【核心程式碼】 【配置檔案】 【測試程式碼】 【測試配置檔案】

---Maven專案標準目錄結構:

src/main/java			核心程式碼
src/main/resources		配置檔案
src/test/java			測試程式碼部分
src/test/resources		測試配置檔案
src/main/webapp			頁面資源,js、css、圖片等等

---maven兩大核心功能

依賴管理
一鍵構建

---maven常用命令

【clean清理】		清理專案編譯所有資訊 
【compile編譯】 	把src/main/java下的類檔案編譯為class檔案
【test測試】		把src/main/java和src/test/java下的類檔案都編譯
【package打包】		把src/main/java和src/test/java下的類檔案都編譯並打成war包
【install安裝】		把src/main/java和src/test/java下的類檔案都編譯並打成war包並把war包安裝到了本地倉庫
【deploy釋出】		不可直接執行,需要進行配置
往後的命令都會把前一個命令執行一次

---maven生命週期

清理生命週期:	clean
預設生命週期:	compile-->test-->package-->install-->deploy		每一個構建專案的命令都對應了maven底層一個外掛
站點生命週期:

---專案物件模型(POM)

專案自身資訊	==》依賴管理模型
專案執行所依賴的jar包資訊
專案執行環境資訊,比如:jdk、tomcat資訊
--依賴管理模型(dependency)
	<dependency>
		<groupId>javax.servlet</groupId>  		//公司組織名稱:路徑
		<artifactId>servlet-api</artifactId>	//專案名
		<version>2.5</version>					//版本號
		<scope>provided</scope>					//jar作用域
	</dependency>

---pom引入的jar包作用域 provided

compile			編譯、測試、執行有效		參與打包
test 			測試						不參與打包
provided		編譯、測試					不參與打包
runtime			測試、執行						
system			編譯、測試					

---工程執行環境的修改

<bui1d> 
  <plugins>
	<p1ugin><!--配置執行tomat版本-->
		<groupId>org.apache.tomcat.maven</groupId>
		<artifactId>tomcat7-maven-plugin</artifactId>
		<bersion>2.2</version>
		<configuration>
			<port>8888</port><!--修改埠號-->
		</configuration>
	</plugin>
	<plugin><!--配置maven編譯外掛版本 即jdk版本-->
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-compiler-plugin</artifactId>
		<configuration>
			<target>1.8</target>
			<encoding>UTF-8</encoding>
		</configuration>
	</plugin>
  </plugins>
</build>

maven專案管理筆記

----maven:一個專案管理工具

--1-依賴管理:maven對專案中jar包的管理過程。
	傳統工程==直接把jar包放置在專案中
	maven工程==真正的jar包放置在倉庫中,專案中只用放置jar包的座標。
	--倉庫三類:【本地】	【遠端(私服)】	【中央倉庫】
	--倉庫間的關係:
		1-啟動maven工程時,maven工程通過pom檔案中jar包座標去本地倉庫
		2-預設情況下,如果本地倉庫沒有對應jar包並連著網,maven工程自動去中央倉庫下載jar包到本地倉庫。
		3-本地倉庫沒有對應jar包,沒有網,在公司同一區域網下,會先從公司私服下載jar包
		4-私服沒有jar包,可從中央倉庫下載,也可從本地上傳
--2-一鍵構建:maven自身集成了tomcat外掛,可以對專案進行編譯、測試、打包、安裝、釋出等操作。
	--maven常用命令
		【clean清理】		清理專案編譯所有資訊 
		【compile編譯】 	把src/main/java下的類檔案編譯為class檔案
		【test測試】		把src/main/java和src/test/java下的類檔案都編譯
		【package打包】		把src/main/java和src/test/java下的類檔案都編譯並打成war包
		【install安裝】		把src/main/java和src/test/java下的類檔案都編譯並打成war包並把war包安裝到了本地倉庫
		【deploy釋出】		打jar包上傳到私服。不可直接執行,需要進行配置

----Maven匯入jar包衝突解決

<dependencies>
<!--maven工程要匯入jar包的座標,就必須要考慮解決jar包衝突
	解決jar包衝突的方式一:
		==第一宣告優先原則:那個jar包的座標靠上的位置,這個jar包就是先宣告的
			先宣告的jar包座標下的依賴包,可以優先進入專案中
	解決jar包衝突的方式二:
		==maven匯入jar包的一些概念
			==直接依賴:專案中直接匯入的jar包,就是該專案的直接依賴包
			==傳遞依賴:專案中沒有直接匯入的jar包,可以通過專案直接依賴jar包傳遞到專案中去
		==路徑近和優先原則。直接依賴路徑比傳遞依賴路徑近,那麼最終進入專案的jar包回事路徑近的直接依賴包
	解決jar包衝突的方式三:
		==當我們要排除某個jar包下依賴包,在配置exclusions標籤的時候,內部可以不寫版本號。
			因為此時依賴包使用的版本和預設本直接匯入的jar包版本一樣
-->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.2.4.RELEASE</version><!--傳遞依賴:會匯入spring-core:4.2.4.RELEASE-->
      <exclusions>
          <exclusion><!--排除該jar包下的傳遞依賴包spring-core-->
              <groupId>org.springframework</groupId>
              <artifactId>spring-core</artifactId>
          </exclusion>
      </exclusions>
  </dependency>
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.2.RELEASE</version><!--傳遞依賴:會匯入spring-core:5.0.2.RELEASE-->
  </dependency>
  <!--<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.2.8.RELEASE</version>&lt;!&ndash;直接依賴:會匯入spring-4.2.8.RELEASE&ndash;&gt;
  </dependency>-->
</dependencies>
----以上座標最終匯入傳遞依賴:spring-core:5.0.2.RELEASE的jar包
----該解決jar包衝突的原則不是做一次專案用一次,而是有時需要匯入一個新jar包時需要用(遵循)

----pom檔案內標籤

<!--
	Maven工程是可以分父子依賴關係的。
	凡是依賴別的專案後,拿到的專案的依賴包,都屬於傳遞依賴。
		比如:當前a專案,被b專案依賴。那麼a專案中所有jar包都會傳遞到b專案中。
			b專案開發者如果愛b專案中匯入一套ssm框架的jar包,對於b專案是直接依賴
			那麼直接依賴的jar包就會把a專案傳遞過去的jar包覆蓋掉。
			為了防止以上情況的出現。我們可以把a專案中主要jar包的座標鎖住,那麼其他依賴該專案的專案中,
			即便有同名jar包直接依賴,也無法覆蓋。
-->
【<dependencyManagement>】== 鎖定jar包版本 
	如在pom檔案里加入:
	<dependencyManagement>
			<dependency>
				<groupId>org.mybatis</groupId>
				<artifactId>mybatis</artifactId>
				<version>${mybatis.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
	--是賦值一份jar包座標到該標籤裡,不是剪下,如果pom檔案外沒有jar包座標,即便鎖住也沒用,因為根本就沒有匯入該jar包
【<properties>】 定義屬性,便於統一管理。標籤內標籤名稱可隨意定義。
	如在pom檔案里加入:
	<!-- 定義屬性 -->
	<properties>
		<spring.version>5.0.2.RELEASE</spring.version>
		<mysql.version>5.1.6</mysql.version>
	</properties>
	<!-- 引用定義的屬性 -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>${spring.version}</version><!-- 引用定義的屬性 -->
	</dependency>

----xml檔案能寫啥標籤,全看檔案上面的約束

----maven工程拆分與聚合

---拆分思想:maven把一個完整的專案,分成不同獨立模組,這些模組都有各自獨立的座標。那個地方需要其中某個模組,就直接引用該模組座標即可。
	今後公司開發一個新專案,先考慮的不是dao、service、utils、domain等如何編寫,而是考慮這些模組是否已經存在。如果存在,直接引用。
---聚合思想:可以把拆分零散的模組聚合到一起編寫一個完整的專案。
---工程和模組的區別:
	工程不等於完整的專案,模組也不等於完整的專案,一個完整的專案看的是程式碼,
	程式碼完整,就可以說這是一個完整的專案。此專案是工程和模組沒有關係。
	工程只能使用自己內部的資源,工程天生是獨立的。後天可以和其他工程或模組建立關聯關係。
	模組天生不是獨立的,模組天生是屬於父工程的,模組一旦建立,所有父工程的資源都可以使用。
---工程和模組關係:
	1-父子工程直接,子模組天生整合父工程,可以使用父工程所有資源。
	2-子模組天生之間天生沒有關係。
	3-父子工程之間,不用建立關係。繼承關係是先天的,不需要手動建立。
	4-平級之間的引用叫依賴,依賴不是先天的,需要後天建立。
	
---傳遞依賴下來的包是否能用?
	--傳遞下來的包是否能用,參考如下:
                  -----------------------------------------------------------
                  直接\傳遞    compile      privider    runtime    test
                  -----------------------------------------------------------
                  compile      compile     -           runtime      -
                  -----------------------------------------------------------
                  privider     privider    privider    privider     -
                  -----------------------------------------------------------
                  runtime      runtime     -           runtime      -
                  -----------------------------------------------------------
                  test         test        -           test         -
                  -----------------------------------------------------------
	直接依賴:作用域==compile
	傳遞依賴:作用域==test
	--如果對應 - ,表示傳遞丟失。
		實際開發中,如果傳遞依賴丟失,表現形式就是jar座標導不進去,做法就是直接再匯入一次。一般不會來查詢是否真的導不進去。

----私服的應用

--安裝與啟動
	解壓安裝包,執行bin下nexus.bat檔案安裝服務
	conf目錄下nexus.properties為主配置檔案
	預設埠:8081
	可以訪問圖形化介面,登入:預設賬號==admin 密碼==admin123
	releases==正式版(發行版)
	snapshot==測試版 
	hosted==第三方 
	proxy==代理   contral==中央倉庫
--配置group後:自動先從releases下載沒有到snapshot沒有到第三方下載沒有到中央倉庫下

--私服操作:
	--程式碼傳到私服:
		1-先可以登入,配置maven配置檔案server標籤下新增登入配置
			 <server> 
			  <id>releases</id> 
			  <username>admin</username> 
			  <password>admin123</password> 
			</server> 
			<server> 
			  <id>snapshots</id> 
			  <username>admin</username> 
			  <password>admin123</password> 
			</server> 
		2-待上傳程式碼模組pom.xml檔案上配置上傳配置
			<distributionManagement>     
				<repository>         
					<id>releases</id> <?--注意:pom.xml 這裡<id> 和 settings.xml中配置的登入的id要一致 -->      
					<url>http://localhost:8081/nexus/content/repositories/releases/</url>     
				</repository>     
				<snapshotRepository>         
					<id>snapshots</id>         
					<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>     
				</snapshotRepository> 
			</distributionManagement> 
		3-執行maven中deploy命令
		4-上傳後還是無法使用?因為能上傳不一定能下載,所以需要愛maven的配置檔案中配置下載
			<!-- 下載jar包配置 -->
			<profile> 
				<!--profile的id -->
				<id>dev</id>
				<repositories>
					<repository> <!--倉庫id,repositories可以配置多個倉庫,保證id不重複 -->
						<id>nexus</id> <!--倉庫地址,即nexus倉庫組的地址 -->
						<url>http://localhost:8081/nexus/content/groups/public/</url> <!--是否下載releases構件 -->
						<releases>
							<enabled>true</enabled>
						</releases> <!--是否下載snapshots構件 -->
						<snapshots>
							<enabled>true</enabled>
						</snapshots>
					</repository>
				</repositories>
				<pluginRepositories> <!-- 外掛倉庫,maven的執行依賴外掛,也需要從私服下載外掛 -->
					<pluginRepository> <!-- 外掛倉庫的id不允許重複,如果重複後邊配置會覆蓋前邊 -->
						<id>public</id>
						<name>Public Repositories</name>
						<url>http://localhost:8081/nexus/content/groups/public/</url>
					</pluginRepository>
				</pluginRepositories>
			</profile>
			<!-- 啟用下載中配置 -->
			<activeProfiles>
				<activeProfile>dev</activeProfile>
			</activeProfiles>

----安裝第三方jar包到本地倉庫

1-cmd進入jar包所在目錄執行
	mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dfile=fastjson-1.1.37.jar -Dpackaging=jar
2-開啟cmd直接執行
	mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=C:\my_java\jar包\fastjson-1.1.37.jar(jar包所在目錄)

----安裝第三方jar包到私服

1-在maven的settings配置檔案中新增登入私服第三方登入資訊
	<server>
		<id>thirdparty</id>
		<username>admin</username>
		<password>admin123</password>
	</server>
2-cmd進入jar包所在目錄執行
	mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=fastjson-1.1.37.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
或2-開啟cmd直接執行
	mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=C:\my_java\jar包\fastjson-1.1.37.jar(jar包所在目錄)-Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty