maven pom文件

什麼是pom

POM表明「項目對象模型」。它是一個名爲pom.xml的文件,是Maven項目的XML表示形式。 在Maven眼中,一個項目根本不須要包含任何代碼,只須要一個pom.xmlmysql

pom 內容

這是直接位於project元素下的元素列表sql

請注意,modelVersion 爲 4.0.0 這是目前惟一支持Maven 2和3的POM版本,且是必填項 數據庫

<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>
複製代碼

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>
 
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0</version>
</project>
複製代碼

上面定義的POM是Maven容許的最小值。groupId、artifactId、version是必填字段,他們三者構成了 maven 的惟一座標。apache

  • <groupId> : 組織id,推薦公司域名反寫,例如com.ailibaba
  • <artifactId>:項目名稱
  • <version>:版本號

打包

經過座標咱們在maven中定義了一個項目,除此以外咱們還須要告訴maven咱們要如何打包這個項目tomcat

<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">
    ...
    <packaging>war</packaging>
    ...
</project>
複製代碼

如上,咱們指定打包方式爲 war包,經常使用的還有jarbash

依賴

Maven的一個強大功能是它處理項目關係:這包括依賴項(和傳遞依賴項),繼承和聚合(多模塊項目)oracle

若是你的項目須要依賴其餘項目,就必須配置依賴框架

<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">
    ...
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <type>jar</type>
            <scope>test</scope>
            <optional>true</optional>
        </dependency>
        ...
    </dependencies>
    ...
</project>
複製代碼

不是全部依賴項均可以在 maven 倉庫中找到,要配置這種依賴,可使用install插件在本地安裝。maven

mvn install:install-file -Dfile = c:\\non-maven-proj.jar -DgroupId = some.group -DartifactId = non-maven-proj -Dversion = 1 -Dpackaging = jar
複製代碼
  • groupId、artifactId、version: 以前講過,這是一個項目的座標
  • type:依賴包類型,默認爲jar

scope

scope 有兩個做用ide

  1. 指的依賴的做用範圍
  2. 限制依賴的傳遞

做用範圍

包括項目的測試、編譯、運行、打包等生命週期。其中,編譯和運行還分爲

  • 測試代碼的編譯和運行
  • 非測試代碼的編譯和運行

scope 的五個可選值,分別是

  • compile :這是默認範圍,參與編譯、測試、運行、打包等生命週期,可傳遞

  • provided :參與編譯、測試、運行,不參與打包,不可傳遞。依賴由運行的環境提供,好比tomcat或者基礎類庫等

  • runtime :不參與編譯,參與測試、運行,可傳遞。好比JDBC類庫,在編譯之時僅依賴相關的接口,在具體的運行之時,才須要具體的mysql、oracle等等數據的驅動程序。

  • test 該依賴僅參與測試用例的編譯和執行,不可傳遞,好比Junit。

  • system :範圍依賴與provided 類似,但依賴項不會從maven倉庫下載,而是從本地系統指定路徑下尋找,須要 systemPath 屬性。

傳遞依賴

A -> B -> C, 當前項目 A,A依賴於B,B依賴於C,知道B在 A中的scope,怎麼知道 C在 A 中的 scope

即,A需不須要 C的問題,本質由 C在B中的scope決定

當 C 在 B 中的scope 是test 或 provided 時,C 直接被丟棄,A不依賴C

不然 A 依賴 C,C的scope 繼承與B 的scope

optional

optional 表示可選依賴,它的值有兩種

  • true:可選依賴
  • false:默認值,非可選依賴

在Maven中可選依賴是不會進行傳遞的

什麼是可選依賴? 假如A依賴B,B中有可選依賴C,那麼除非A顯示聲明,不然可選依賴包是不會導入進依賴的。

爲何要有可選選依賴?

好比,一個持久層模塊不但能夠持久化Oracle數據庫,也能夠持久化Mysql數據庫,那麼在這個持化層框架中應該對應了兩份代碼,一份是關於Oracle持久化的處理,一份是關於Mysql持久化的處理,若是將持久層模塊的Oracle與Mysql驅動均設置爲非可選依賴,那麼依賴這個持久層框架的項目類路徑中將同時出現Mysql以及Oracle的驅動Jar包,若是真的這樣,你會不會感受到這種設計很奇葩,所以Maven經過Optional關鍵字來處理這種問題

相關文章
相關標籤/搜索