maven工程pom.xml配置相關

一、什麼是 pom?

POMProject Object Model 的縮寫,即項目對象模型。

pom.xml 就是 maven 的配置文件,用以描述項目的各種信息。

<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
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <!-- The Basics -->
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>
  <packaging>...</packaging>
  <dependencies>...</dependencies>
  <parent>...</parent>
  <dependencyManagement>...</dependencyManagement>
  <modules>...</modules>
  <properties>...</properties>

  <!-- Build Settings -->
  <build>...</build>
  <reporting>...</reporting>

  <!-- More Project Information -->
  <name>...</name>
  <description>...</description>
  <url>...</url>
  <inceptionYear>...</inceptionYear>
  <licenses>...</licenses>
  <organization>...</organization>
  <developers>...</developers>
  <contributors>...</contributors>

  <!-- Environment Settings -->
  <issueManagement>...</issueManagement>
  <ciManagement>...</ciManagement>
  <mailingLists>...</mailingLists>
  <scm>...</scm>
  <prerequisites>...</prerequisites>
  <repositories>...</repositories>
  <pluginRepositories>...</pluginRepositories>
  <distributionManagement>...</distributionManagement>
  <profiles>...</profiles>
</project>

1. relativePath

默認值爲../pom.xml
查找順序:relativePath 元素中的地址本地倉庫遠程倉庫
設定一個空值將始終從倉庫中獲取,不從本地路徑獲取。
如:

<relativePath/>

2. dependencyManagerment

首先,該標籤裏面的依賴不會被子模塊直接繼承。若是不加這個標籤,則父pom裏面的 所有依賴 都會被子模塊直接繼承過去,若子模塊不需要使用全部的依賴,你卻強制給子模塊,子模塊打包時會因爲多餘的jar包顯得很臃腫。

一般做法是
  在父pom<dependencyManagerment>標籤裏面聲明所有的依賴及其版本號,可以用<properties>標籤進一步對版本號進行集中管理。子模塊若想使用父pom中聲明的依賴,需要在自己的模塊中聲明一下,但不用寫版本號(當子模塊繼承了父pom後,會默認向上找父pom<dependencyManagerment>標籤中依賴聲明的版本號;若子模塊中寫了版本號,就優先使用自己的版本號)。這樣子模塊用什麼依賴就取什麼依賴即可,父pom也可以對所有的依賴進行統一的管理。

3.


二、Maven依賴中scope詳解

scope元素的作用:控制 dependency 元素的使用範圍。通俗的講,就是控制 Jar 包在哪些範圍被加載和使用。

scope的默認值是compile。

compile

默認就是compile,什麼都不配置也就是意味着compile。compile表示被依賴項目需要參與當前項目的編譯,當然後續的測試,運行週期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去。

test

scope爲test表示依賴項目僅僅參與測試相關的工作,包括測試代碼的編譯,執行。比較典型的如junit。

runntime

runntime表示被依賴項目無需參與項目的編譯,不過後期的測試和運行週期需要其參與。與compile相比,跳過編譯而已,說實話在終端的項目(非開源,企業內部系統)中,和compile區別不是很大。比較常見的如JSR×××的實現,對應的API jar是compile的,具體實現是runtime的,compile只需要知道接口就足夠了。oracle jdbc驅動架包就是一個很好的例子,一般scope爲runntime。另外runntime的依賴通常和optional搭配使用,optional爲true。我可以用A實現,也可以用B實現。

provided

provided意味着打包的時候可以不用包進去,別的設施(Web Container)會提供。事實上該依賴理論上可以參與編譯,測試,運行等週期。相當於compile,但是在打包階段做了exclude的動作。

system

從參與度來說,也provided相同,不過被依賴項不會從maven倉庫抓,而是從本地文件系統拿,一定需要配合systemPath屬性使用。

scope的依賴傳遞

A–>B–>C。當前項目爲A,A依賴於B,B依賴於C。知道B在A項目中的scope,那麼怎麼知道C在A中的scope呢?答案是:
當C是test或者provided時,C直接被丟棄,A不依賴C;
否則A依賴C,C的scope繼承於B的scope。


三、spring-boot- maven-plugin插件作用

spring-boot-maven-plugin這個插件是專門爲springBoot項目服務的。

作用是打包時,對mvn package打包後的結果進行二次打包,目的是將當前項目所有的依賴也打包進來(會自動的找到啓動類作爲main class),官方解釋此時的jar包叫fat.jar。若不加這個插件,就只打包當前項目中的東西,依賴不會被打包進來。

注意: 
spring-boot-maven-plugin打成的jar包可以運行,但是不能被其他工程依賴。所以被其他模塊依賴的模塊如common模塊,不能加這個,否則會提示找不到程序包。

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