Maven鞏固一

 

1、基本pom.xml目錄結構

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <!-- maven 2\3都是這個 -->
<modelVersion>4.0.0</modelVersion>
    <groupId>com.lingz.cloud</groupId>
    <artifactId>gateway</artifactId>
    <version>2.1.5.SNAPSHOT</version>
    <!-- name 非必須,只是更好的描述這個項目模塊的做用,建議添加 -->
    <name>cloud-gateway</name>
    <description>Demo project for Spring Boot</description>
   
    <properties>
       <java.version>1.8</java.version>
   </properties>
   
   <dependencyManagement></dependencyManagement>
   
   <dependencies></dependencies>
   
    <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
       </plugins>
   </build>
   
</project>    

 

 

 

一、groupId、artifactId、version

groupId、artifactId、version 三者定義了一個項目的座標。

groupId: 公司的一個項目組,好比我公司下的cloud項目 com.lingz.cloud
artifactId: 在項目中的惟一模塊,好比cloud項目組裏的網關gateway gateway \ 註冊中心 registry-center
version: 即這個項目組裏這個模塊的版本,即 artifact 的版本


version
* SNAPSHOT ,快照,當前項目模塊還在開發中,不穩定版本。


PS:
<dependency>中的<scope>,指生效範圍:
* test 範圍,只測試代碼有用,主代碼使用編譯會出錯。
* 默認 compile 即主代碼和測試代碼都有效。

 

 

二、打包(添加主類)

默認下,打成jar不會含有test目錄下的,注意 ,/main/java 和 /resources 打包後不見了,即從他們的子目錄開始打包,他們只是約定的目錄而已。java

- 包的路徑通常爲 groupId 的名稱,即 com.lingz.cloud spring

- 主類的名字就和 artifactId 一致,即 Cloud.class ( 都是約定,只是更清晰。)apache

//單純打包可能出現找不到主類的狀況,這時候能夠在 <plugins> 裏面添加插件

 

 

 

三、一些命令

(1)mvn clean compile 編譯主代碼

 

clean 
- 告訴maven清除輸出目錄 target/
compile
- 編譯項目主代碼

執行順序
clean:clean   清除 target/
resources:resources  (後續講)
compiler:compile  將項目主代碼編譯到 target/classes目錄下

// 這裏 X:Y 表明 X插件下的Y目標

 

(2)mvn clean test 編譯執行測試代碼

生命週期執行順序
clean:clean
resources:resources
compiler:compile
resources:testResources
compiler:testCompile  //生成編譯後的二進制測試代碼,在target/test-classes下。
surefire:test // surefire是Maven負責執行測試的插件,這裏執行 CloudTest.class 類,並輸出執行結果

 

(3)mvn clean package 編譯打包

沒有指定打包格式時,默認打包成 jar包:
jar:jar
在package打包以前,還會執行test,能夠在idea裏面關掉。

 

(4)mvn clean install 將打包的jar安裝到Maven本地倉庫 !! !

生命週期
···
jar:jar
install:install  //添加到本地倉庫。能夠在對應文件夾看到有pom和對應的jar

//會根據pom配置自動下載所需的依賴構件,因此能夠測試是否跑的通
在執行完打包後,會將打包結果放到本地倉庫,這樣就能給其餘項目引用了,只要添加<dependency>便可。

 

2、Maven座標

 

  • Maven座標包括 groupId 、artifactId 、version 、packaging 、 classifierapi

  • PS: classifier = jdk15 ; 指定的是Java5maven

一、座標元素詳解

//groupId(必須)
能夠理解爲定義這個Maven項目所在的項目組,由公司.項目組定義。項目組裏能夠有不少模塊,就是下面的artifact
 
//artifactId(必須)
指定這個Maven項目所屬的模塊。好比 SpringFramework 這個項目組裏的 core 核心模塊。推薦用項目組+模塊名命名,即 spring-core ,這樣打包生成就是 spring-core-0.0.1.jar

//version(必須)
該Maven項目的版本。

//packaging(可選)
定義Maven項目的打包方式,默認jar。打包方式會影響構建的生命週期(使用不一樣的插件:目標)

//classifier(不可直接定義)
- 不能直接定義,附屬構件不是項目默認生成,而是由附加的插件幫助生成。
- 做用是生成項目的一些附屬構件,如生成spring-core-0.0.1-javadoc/sources.jar
- 這個 javadoc sources就是兩個附屬構件的classifier


//最終生成的文件名 = artifactId + version [-classifier] . packaging

 

 

3、依賴配置

一、基本結構

<project>
    ...
	<dependencies>
    	<dependency>
        	<groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <type>...</type>
            <scope>...</scope>
            <optional>...</optional>
            <execlusions>
            	<execlusion>...</execlusion>
            </execlusions>
            ...
        </dependency>
        ...
    </dependencies>
    ...
</project>        


<!-- 關於optional,可選依賴-->
<optional>true</optional>
表明這個依賴是可選的,好比B裏面有兩個依賴是 optional = true , 而A依賴B
同時A須要B中這兩個可選的依賴的其中一個(二選一),那麼A不會直接用B去引用這兩個中的一個
而是顯示在A中的依賴聲明其中一個依賴,這就是 可選依賴。

 

二、依賴範圍

主代碼會使用一套classpath , 測試代碼也會使用一套classpath ,實際運行的時候又會使用一套 classpathide

即:編譯classpath 、 測試classpath 、 運行classpath spring-boot

編寫代碼 和 運行代碼是不同的階段 !!!測試

// compile
- 編譯依賴範圍 。
- 默認,即未指定時,編譯、測試、運行時都須要這個依賴。

// test
- 測試依賴範圍
- 僅測試classpath有效。

// provided
- 已提供依賴範圍
- 編譯classpath 、 測試classpath 都有效,可是運行classpath無效!!!如 servlet-api,運行時容器已經提供。


// runtime
- 運行時依賴範圍
- 編譯主代碼時無效,可是測試 classpath 和運行classpath 有效
- 如JDBC驅動實現。項目編寫時只須要JDK提供的JDBC接口,只有運行項目時才須要實現上述接口的具體JDBC驅動

// system
- 系統依賴範圍
- 和 provided 的依賴效果徹底一致。(僅運行時classpath 無效。)
- 不一樣的是:必須經過 systemPath元素顯示指定依賴文件的路徑。
- 此類依賴每每和中央Maven倉庫無關,而是與本機系統綁定,構建是不可移植,少用。
- systemPath元素能夠引入環境變量。


// import 
- 導入依賴範圍。
- 不會對三種 classpath 產生實際影響。


 

4、依賴傳遞性

Maven會解析各個直接依賴的POM,將那些必要的間接依賴,以傳遞性依賴的形式引入到項目中(A→B→C,則以傳遞性依賴形式引入C)。ui

 

5、依賴調解

如有 A→B→C→X(1.0)和 A→D→X(2.0),則會選第二條,根據「路徑最近者優先」idea

若是路徑相同,則根據POM中依賴聲明的順序決定誰先被解析,順序越前越先。

 

6、排除依賴

B引用了一個老版本依賴C(1.0-SNAPSHOT) ,而A須要依賴B,可是不想用這個老版本C,因此能夠在B排除,而後本身引入一個新的C

<dependencies>
	<dependency>
    	<groupId>com.lingz.cloud</groupId>
        <artifactId>B</artifactId>
        <version>1.0</version>
        <execlusions>
        	<execlusion>
            	<groupId>com.alibaba.utils</groupId>
      		    <artifactId>C</artifactId>
            </execlusion>
        </execlusions>
    </dependency>
    <dependency>
    	<groupId>com.byte.utils</groupId>
        <artifactId>C</artifactId>
        <version>2.0</version>
    </dependency>
</depedencies>

 

7、POM自定義常量(依賴歸類)

就是在properties裏面配置一些常量,通常能夠是版本號,而後在下面的依賴使用

<project>
	...
	<properties>
    	<springframework.version>5.1.2</springframework.version>
    </properties>
	...
    <dependencies>
    	 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
             <version>${springframework.version}</version>
    	</dependency>
    </dependencies>
</project>

 

 

8、依賴分析

mvn dependency:list
mvn dependency:tree
mvn dependency:analyze
相關文章
相關標籤/搜索