Maven坐標(biāo)
像數(shù)學(xué)中橫坐標(biāo)簸喂,縱坐標(biāo)一樣块差,兩個坐標(biāo)確定一個點(diǎn)侵续,甚至是三維的,三點(diǎn)確定一個點(diǎn)憨闰,Maven也有相應(yīng)的定義規(guī)則:任何一個構(gòu)件在Maven中都有唯一標(biāo)識状蜗,Maven坐標(biāo)元素有g(shù)roupId,artifactId,version,packaging,classifier,當(dāng)我們提供正確的坐標(biāo)鹉动,我們就能得到對應(yīng)的構(gòu)件轧坎。
坐標(biāo)定義
groupId:?定義了當(dāng)前Maven項(xiàng)目隸屬的實(shí)際項(xiàng)目。在實(shí)際運(yùn)用中训裆,一個組織中有幾個項(xiàng)目也很正常眶根,這種情況下,groupId應(yīng)該定義到模塊級別边琉。它的表示方式跟java包名表示方式類似属百,通常與域名反轉(zhuǎn)一一對應(yīng),如公司apple公司变姨,banana項(xiàng)目族扰,groupId則變現(xiàn)為com.apple.banana
artifactId:?定義了實(shí)際項(xiàng)目中的一個Maven項(xiàng)目或者模塊,書中推薦做法是定欧,以實(shí)際項(xiàng)目名稱作為前綴渔呵,默認(rèn)情況下,Maven生成的構(gòu)件砍鸠,會以artifactId開頭扩氢,如nexus-indexer-2.0.jar,這樣命名就能夠容易區(qū)分開來了爷辱。
version:?表示當(dāng)前項(xiàng)目的版本
packaging:?表示項(xiàng)目的打包的方式录豺,默認(rèn)為jar
classifier:?該元素是用來幫助定義構(gòu)建輸出的一些附屬構(gòu)件,附屬構(gòu)件與主構(gòu)件對應(yīng)饭弓,如上面的nexus-indexer-2.0.jar双饥,項(xiàng)目可能通過一些插件生成nexus-indexer-2.0-javadoc.jar這樣的一些附屬構(gòu)件,注意不能直接定義項(xiàng)目的classifier弟断,因?yàn)楦綄贅?gòu)件不是項(xiàng)目默認(rèn)生成的咏花,而是附加的插件幫助生成。
Maven依賴
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
? <modelVersion>4.0.0</modelVersion>
? <parent>
? ? <groupId>com.fbb</groupId>
? ? <artifactId>fbbParent</artifactId>
? ? <version>1.0</version>
? </parent>
? <groupId>com.fbb</groupId>
? <artifactId>fbb-admin</artifactId>
? <version>1.0</version>
? <packaging>war</packaging>
? <name>fbb-admin Maven Webapp</name>
? <url>http://maven.apache.org</url>
? <properties>
? ? <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
? </properties>
? <dependencies>
? ? <dependency>
? ? ? <groupId>junit</groupId>
? ? ? <artifactId>junit</artifactId>
? ? ? <version>3.8.1</version>
? ? ? <scope>test</scope>
? ? </dependency>
? ? <dependency>
? ? ? ? <groupId>com.fbb</groupId>
? ? ? ? <artifactId>fbb-web</artifactId>
? ? ? ? <version>1.0</version>
? ? </dependency>
? ? <dependency>
? ? ? ? <groupId>com.fbb</groupId>
? ? ? ? <artifactId>fbb-service</artifactId>
? ? ? ? <version>1.0</version>
? ? </dependency>
? </dependencies>
? <build>
? ? <finalName>fbb-admin</finalName>
? ? <plugins>
? ? ? ? <plugin>
? ? ? ? ? ? <artifactId>maven-war-plugin</artifactId>
? ? ? ? ? ? <version>2.5</version>
? ? ? ? ? ? <configuration>
? ? ? ? ? ? ? ? <warSourceExcludes>node_modules\**</warSourceExcludes>?
? ? ? ? ? ? </configuration>
? ? ? ? </plugin>
? ? </plugins>
? </build>
</project>
上面的pom.xml文件阀趴,是一個項(xiàng)目的總體定義昏翰,其中?為項(xiàng)目父標(biāo)簽苍匆,groupId,artifactId,version棚菊,packaging锉桑,name,url等元素定義了fbb-admin這個項(xiàng)目的基本信息窍株,標(biāo)簽標(biāo)示本項(xiàng)目的依賴,通過項(xiàng)目的依賴關(guān)系定義攻柠,引進(jìn)項(xiàng)目的依賴球订。
groupId,artifactId,version:?依賴的基本坐標(biāo)瑰钮,項(xiàng)目依靠坐標(biāo)才能找到依賴冒滩。
type:?依賴的類型,默認(rèn)為jar
scope:?打包的范圍浪谴,比如test开睡,表示測試時候會編譯該代碼。
optional苟耻,以及exclusions標(biāo)簽:?一個標(biāo)記依賴是否可選篇恒,一個表示用來排除傳遞性依賴。
依賴范圍
在實(shí)際項(xiàng)目中凶杖,編譯主項(xiàng)目代碼是一套classpath胁艰,編譯和測試又是另外一套classpath,實(shí)際項(xiàng)目運(yùn)行的時候又是另外一套classpath智蝠。依賴范圍也就是上面講到的標(biāo)簽來進(jìn)行控制腾么。
compile:?編譯依賴范圍,默認(rèn)使用此范圍杈湾,此范圍下三套classpath都有效
test:?測試依賴范圍解虱,只對測試classpath有效。在編譯主代碼或者運(yùn)行項(xiàng)目的時候無法使用此類依賴漆撞。
provided:?已提供依賴范圍殴泰,對編譯和測試的classpath有效。典型例子叫挟,servlet-api運(yùn)行時容器已經(jīng)提供艰匙,所以不需要重復(fù)引進(jìn)此依賴
runtime:?運(yùn)行時依賴范圍,對測試和運(yùn)行classpath有效抹恳,編譯主代碼無效员凝。
system:?系統(tǒng)依賴范圍,和provided的范圍一樣奋献,但是使用此依賴時必須通過systemPath元素顯示地指定依賴文件的路徑健霹,由于此類依賴不是通過Maven倉庫解析旺上,而且往往與本機(jī)系統(tǒng)綁定,需要謹(jǐn)慎使用糖埋。
Maven通過一系列的坐標(biāo)來確定唯一的項(xiàng)目位置宣吱,通過依賴坐標(biāo),引進(jìn)項(xiàng)目之間的依賴關(guān)系瞳别。以目前自己的見解征候,各個開發(fā)人員公用一套pom文件,統(tǒng)一了開發(fā)的版本祟敛,不會出現(xiàn)因?yàn)槟硞€依賴的接口因?yàn)榘姹镜淖兏霈F(xiàn)不兼容問題疤坝,使用Maven更好地去幫助我們管理好我們的項(xiàng)目倉庫。