麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Maven

2019-11-14 23:32:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
Maven - dependency那些事兒

身邊有幾位剛使用Maven的同學(xué)表示——在一個(gè)叫"pom.xml"的文件里聲明一個(gè)依賴就不用去手動(dòng)添加jar了,感覺(jué)這東西和自己手動(dòng)管理依賴沒(méi)太大區(qū)別。 當(dāng)然,并不是這樣,在此記錄dependency那些事兒。

dependency

一個(gè)依賴可以按照maven的坐標(biāo)標(biāo)準(zhǔn)進(jìn)行定義。比如:

<dependency>    <groupId>javax.servlet</groupId>    <artifactId>javax.servlet-api</artifactId>    <version>3.1.0</version>    <scope>PRovided</scope></dependency>

上面是最常見(jiàn)的坐標(biāo)屬性,偶爾也會(huì)看到有classifier。下面簡(jiǎn)單說(shuō)明一下標(biāo)簽:

  • groupId:通常用作項(xiàng)目標(biāo)識(shí),比如SpringFramework項(xiàng)目的groupId是org.springframework。也可能會(huì)用作項(xiàng)目隸屬的組織的名稱,但組織下有多個(gè)項(xiàng)目則不好分辨,盡量保證層次級(jí)別明確。
  • artifactId:級(jí)別低于groupId的項(xiàng)目標(biāo)識(shí),通常用于標(biāo)識(shí)一個(gè)module,比如spring-aop。
  • classifier:用于標(biāo)識(shí)隸屬于module的附件。
  • version:當(dāng)前項(xiàng)目版本,版本的寫法應(yīng)有相應(yīng)的規(guī)范。
  • type:依賴的類型,通常不需要聲明,默認(rèn)為jar。
  • scope:依賴范圍,默認(rèn)為compile。
  • packaging:打包方式,默認(rèn)為jar。
  • optional:依賴是否可選。
  • exclusions:排除傳遞性依賴。

scope

引入Junit依賴時(shí)通常需要聲明test scope:

<dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>4.11</version>    <scope>test</scope></dependency>

大概能猜出是測(cè)試時(shí)使用該依賴,但不完全正確。Maven編譯代碼時(shí)需要使用classpath,但classpath不止一種,而是:

  • 編譯classpath
  • 測(cè)試classpath
  • 運(yùn)行classpath

Maven會(huì)根據(jù)需要使用不同的classpath,而scope可以用來(lái)控制依賴與這三種classpath之間的關(guān)系。

  • compile:默認(rèn)使用該項(xiàng),對(duì)三種classpath都有效。
  • test:僅對(duì)測(cè)試classpath有效,如上面的Junit。
  • provided:對(duì)編譯和測(cè)試classpath有效,比如開(kāi)頭貼出的servlet-api的依賴,會(huì)在運(yùn)行時(shí)由app server提供,Maven不可以重復(fù)引入。
  • runtime:對(duì)測(cè)試和運(yùn)行classpath有效,編譯時(shí)無(wú)效。
  • system:對(duì)編譯和測(cè)試classpath有效,但必須通過(guò)systemPath顯示指定依賴文件的位置,可以使用系統(tǒng)環(huán)境變量。
  • import:不針對(duì)任何一種classpath,該項(xiàng)用于導(dǎo)入其他pom中的dependencyManagement元素。

通常會(huì)使用前三種。scope不僅用來(lái)控制依賴與classpath之間的關(guān)系,還會(huì)對(duì)依賴的傳遞性產(chǎn)生影響。傳遞性依賴? 比如A依賴B,B依賴C,則A對(duì)于B是直接依賴,對(duì)于C是傳遞性依賴。A對(duì)B、B對(duì)C的依賴范圍決定了A對(duì)C的依賴范圍。如何決定? 下面給出一個(gè)關(guān)系表,垂直表示第一依賴,水平表示第二依賴,交叉單元格為傳遞性依賴。

compiletestprovidedruntime
compilecompileruntime
testtesttest
providedprovidedprovidedprovided
runtimeruntimeruntime

考慮一下這樣的依賴關(guān)系,A-> C -> D(1.0)和A-> B -> D(2.0)此時(shí)應(yīng)該如何處理? 引入兩種D依賴是不可能的。Maven有依賴調(diào)節(jié)原則:

  • 路徑最近優(yōu)先。
  • 當(dāng)路徑長(zhǎng)度相同,聲明順序優(yōu)先。

對(duì)于上面的例子,A-> C -> D(1.0)和A-> B -> D(2.0)的路徑長(zhǎng)度相同,但前者聲明早于后者,因此加入的傳遞性依賴則是D(1.0)。

另外,還需要考慮這樣一個(gè)場(chǎng)景。A依賴B、B依賴X和Y,X和Y都是可選依賴,即<optional>true</optional>,且4個(gè)都是compile。此時(shí),X和Y則不會(huì)被傳遞,對(duì)A是不可見(jiàn)的。

exclusions

但依賴調(diào)節(jié)并不解決所有問(wèn)題,我們還需要exclusions來(lái)進(jìn)行排除依賴。例如這樣一個(gè)情況,工程中引入了A,A依賴B,但是B的版本過(guò)舊。此時(shí)可以使用exclusions排除該傳遞性依賴,并顯示聲明一個(gè)最新版本的B依賴。比如這樣:

<dependency>    <groupId>com.lowagie</groupId>    <artifactId>itext</artifactId>    <version>4.2.1</version>    <exclusions>        <exclusion>            <artifactId>bcmail-jdk14</artifactId>            <groupId>bouncycastle</groupId>        </exclusion>        <exclusion>            <artifactId>bcprov-jdk14</artifactId>            <groupId>bouncycastle</groupId>        </exclusion>        <exclusion>            <artifactId>bctsp-jdk14</artifactId>            <groupId>bouncycastle</groupId>        </exclusion>    </exclusions></dependency>

properties

用于統(tǒng)一管理屬性,比如我們引入很多spring framework:

<dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-web</artifactId>    <version>4.0.3 RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-webmvc</artifactId>    <version>4.0.3 RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-jms</artifactId>    <version>4.0.3 RELEASE</version></dependency>

可見(jiàn)版本都是一樣的,想更改版本時(shí)再一個(gè)一個(gè)修改太麻煩。

properties可以解決這一問(wèn)題:

<properties>        <spring.version>4.0.3.RELEASE</spring.version></properties>

引入spring可以改為:

<dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-web</artifactId>    <version>${spring.version}</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-webmvc</artifactId>    <version>${spring.version}</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-jms</artifactId>    <version>${spring.version}</version></dependency>

這樣確實(shí)簡(jiǎn)介了不少,但你可能仍然討厭XML。

興許,以后我們不會(huì)再用XML寫構(gòu)建文件。我們可能會(huì)用一些插件(比如Polyglot for Maven)或者其他的什么東西(比如Gradle)。

repository

可以把Maven的倉(cāng)庫(kù)分為兩種:

  • 本地倉(cāng)庫(kù)
  • 遠(yuǎn)程倉(cāng)庫(kù)

Maven尋找一個(gè)dependency時(shí)會(huì)先從本地倉(cāng)庫(kù)查找,如果找不到則在遠(yuǎn)程倉(cāng)庫(kù)查找,發(fā)現(xiàn)則下載到本地倉(cāng)庫(kù)使用。如果都查找失敗,會(huì)提示build failure。

或者,我們也可以把本地的jar放到本地倉(cāng)庫(kù)中:

mvn install:install-file -Dfile=jar包的路徑 -DgroupId=我的groupId -DartifactId=我的artifactId -Dversion=我的version -Dpackaging=jar

本地倉(cāng)庫(kù)默認(rèn)路徑是用戶目錄下的.m2/repository/;該路徑可以在settings.xml中修改,比如:

<localRepository>    /usr/local/maven/repository</localRepository>

那么遠(yuǎn)程倉(cāng)庫(kù)又在哪里?打開(kāi)$M2_HOME/lib/maven-model-builder-3.2.1.jar里的org/apache/maven/model/pom-4.0.0.xml

看到遠(yuǎn)程倉(cāng)庫(kù)的設(shè)置如下:

 <repositories>    <repository>        <id>central</id>        <name>Central Repository</name>        <url>http://repo.maven.apache.org/maven2</url>        <layout>default</layout>        <snapshots>            <enabled>false</enabled>        </snapshots>    </repository> </repositories>

當(dāng)然,我們也可以配置其他遠(yuǎn)程倉(cāng)庫(kù),比如這樣:

<repositories>    <repository>        <id>opensesame</id>        <name>Alibaba OpenSource Repsoitory</name>        <url>http://code.alibabatech.com/mvn/releases/</url>        <snapshots>            <enabled>false</enabled>        </snapshots>    </repository></repositories>

配置遠(yuǎn)程倉(cāng)庫(kù)時(shí)也需要注意一些選項(xiàng)

  • id:倉(cāng)庫(kù)的唯一標(biāo)識(shí)符
  • name:倉(cāng)庫(kù)名稱
  • url:倉(cāng)庫(kù)地址,通常都是http協(xié)議
  • layout:默認(rèn)為default,表示倉(cāng)庫(kù)布局為maven2和maven3的布局
  • release/snapshots
    • enabled:是否支持發(fā)布版/快照版
    • updatePolicy:更新策略
      • 默認(rèn)為daily
      • always : 每次構(gòu)建時(shí)檢查
      • never : 從不檢查
      • interval : X:每隔X分鐘間差
    • checksumPolicy:校驗(yàn)策略,默認(rèn)為warn,另外有failignore

為什么區(qū)分release和snapshot? 不能只通過(guò)版本號(hào)進(jìn)行區(qū)分嗎?

試想一下這樣的場(chǎng)景,假設(shè)有A和B兩個(gè)模塊,A依賴B,且B尚未開(kāi)發(fā)完成。如何讓B模塊每次更新后讓A的開(kāi)發(fā)人員獲取?每次更新后提示A的開(kāi)發(fā)人員從VCS上pull下來(lái)構(gòu)建?或者不停地?fù)Q版本號(hào)? 確實(shí),就算B有了變化,但version也是依賴的標(biāo)識(shí)之一。

如果依賴是snapshot則能解決這樣的問(wèn)題,snapshot發(fā)布時(shí)會(huì)加上一個(gè)時(shí)間戳,每次構(gòu)建A的時(shí)候會(huì)檢查B是否最新,間差更新策略就是上面的updatePolicy。另外,也可以執(zhí)行mvn clean install-U強(qiáng)制更新。

遠(yuǎn)程倉(cāng)庫(kù)不都是想訪問(wèn)就訪問(wèn)的,有些倉(cāng)庫(kù)出于安全考慮,需要提供認(rèn)證信息才可以訪問(wèn)。認(rèn)證必須在settings.xml中設(shè)置,下面是一個(gè)例子:

<servers>   <server>        <id>server001</id>        <username>my_login</username>        <passWord>my_password</password>        <privateKey>${user.home}/.ssh/id_dsa</privateKey>        <passphrase>some_passphrase</passphrase>        <filePermissions>664</filePermissions>        <directoryPermissions>775</directoryPermissions>        <configuration></configuration>    </server></servers>

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产88久久久国产精品免费二区 | 二区三区在线观看 | 曰韩一二三区 | 国产一级免费不卡 | 久久久久久久爱 | 黄视频网站免费观看 | 性欧美xxxx免费岛国不卡电影 | 亚洲情av | 88xx成人永久免费观看 | 成人一区二区三区在线 | 亚洲欧美国产高清va在线播放 | www.99av| 亚洲看片网 | 国产午夜免费福利 | 久久国产精品二国产精品中国洋人 | 欧美一区2区三区4区公司二百 | 国产chinesehd精品91 | 欧美一级做性受免费大片免费 | 免费欧美一级视频 | 久久精品一区二区三区国产主播 | 国产999精品久久久久 | 91在线视频观看 | 久久亚洲精品久久国产一区二区 | 精品亚洲视频在线 | 日日综合 | 久久国产亚洲精品 | 欧美女同hd | 日韩激情一区 | 欧美一级片一区 | 国产精品久久久久久久不卡 | 视频www| 免费啪视频在线观看 | 蜜桃av网| 成人h精品动漫一区二区三区 | 毛片在哪看 | 黄色网址进入 | 国产精品亚洲精品日韩已方 | 亚洲第五色综合网 | 黄色片免费看看 | 在线看一区二区三区 | 黄色一级片毛片 |