<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: 公司的一個項目組,好比我公司下的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> 裏面添加插件
clean
- 告訴maven清除輸出目錄 target/
compile
- 編譯項目主代碼
執行順序
clean:clean 清除 target/
resources:resources (後續講)
compiler:compile 將項目主代碼編譯到 target/classes目錄下
// 這裏 X:Y 表明 X插件下的Y目標
生命週期執行順序
clean:clean
resources:resources
compiler:compile
resources:testResources
compiler:testCompile //生成編譯後的二進制測試代碼,在target/test-classes下。
surefire:test // surefire是Maven負責執行測試的插件,這裏執行 CloudTest.class 類,並輸出執行結果
沒有指定打包格式時,默認打包成 jar包:
jar:jar
在package打包以前,還會執行test,能夠在idea裏面關掉。
生命週期
···
jar:jar
install:install //添加到本地倉庫。能夠在對應文件夾看到有pom和對應的jar
//會根據pom配置自動下載所需的依賴構件,因此能夠測試是否跑的通
在執行完打包後,會將打包結果放到本地倉庫,這樣就能給其餘項目引用了,只要添加<dependency>便可。
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
<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 產生實際影響。
Maven會解析各個直接依賴的POM,將那些必要的間接依賴,以傳遞性依賴的形式引入到項目中(A→B→C,則以傳遞性依賴形式引入C)。ui
如有 A→B→C→X(1.0)和 A→D→X(2.0),則會選第二條,根據「路徑最近者優先」 。idea
若是路徑相同,則根據POM中依賴聲明的順序決定誰先被解析,順序越前越先。
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>
就是在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>
mvn dependency:list mvn dependency:tree mvn dependency:analyze