maven簡介和使用1

首先說明,本人并不是第一次學(xué)習(xí)maven,也不是第二次學(xué)習(xí)maven秤标,為什么還要來學(xué)習(xí)寫下這些東西?是因?yàn)橹耙恢倍际峭ㄟ^視頻或者百度進(jìn)行學(xué)習(xí)宙刘,知識(shí)零散且不全面苍姜,甚至更有版本的知識(shí)穿插問題,故決定以官方文檔為基礎(chǔ)進(jìn)行系統(tǒng)性學(xué)習(xí)悬包。
什么是POM衙猪?

pom代表“項(xiàng)目對(duì)象模型”。它是名為pom.xml的文件中保存的Maven項(xiàng)目的XML表示布近。當(dāng)有Maven的人在場時(shí)垫释,談?wù)撘粋€(gè)項(xiàng)目是在哲學(xué)意義上說的,而不僅僅是包含代碼的文件集合撑瞧。項(xiàng)目包含配置文件棵譬、所涉及的開發(fā)人員及其角色、缺陷跟蹤系統(tǒng)预伺、組織和許可證订咸、項(xiàng)目所在位置的URL、項(xiàng)目的依賴項(xiàng)酬诀,以及所有其他可以提供代碼生命的小部分脏嚷。這是一個(gè)一站式商店,所有與項(xiàng)目有關(guān)的事情瞒御。事實(shí)上父叙,在Maven世界中,一個(gè)項(xiàng)目根本不需要包含任何代碼,只需要pom.xml趾唱。

POM 是用來項(xiàng)目的構(gòu)成屿岂,就像介紹一個(gè)人是誰,在哪一樣鲸匿,不影響構(gòu)建的生命周期爷怀。

一個(gè)最基本的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>

? <groupId>org.codehaus.mojo</groupId>

? <artifactId>my-project</artifactId>

? <version>1.0</version>

<!-- 依賴父項(xiàng)目 -->

<parent>

? ? <groupId>org.codehaus.mojo</groupId>

? ? <artifactId>my-parent</artifactId>

? ? <version>2.0</version>

? ? <relativePath>../my-parent</relativePath>

? </parent>

<dependencies>

? ? <dependency>

? ? ? <groupId>junit</groupId>

? ? ? <artifactId>junit</artifactId>

? ? ? <version>4.12</version>

? ? ? <type>jar</type>

? ? ? <scope>test</scope>

? ? ? <optional>true</optional>

? ? </dependency>

</dependencies>

?<packaging>war</packaging>

</project>

配置文檔說明:

modelVersion 指定pom當(dāng)前版本。

groupId: 組織或團(tuán)隊(duì) eg: org.apache

artifactId: 項(xiàng)目或模塊名 eg: spring

version: 當(dāng)前軟件的版本 eg:1.0.0

packaging: 項(xiàng)目投入到生產(chǎn)環(huán)境當(dāng)中前带欢,都需要對(duì)項(xiàng)目進(jìn)行一系列的打包操作运授,所以需要指定打包成什么,eg:war乔煞、jar等等吁朦。默認(rèn)

是jar,主要包類型:pom,jar,maven-plugin,ejb,war,ear,rar.

dependencies: 項(xiàng)目的依賴列表渡贾,maven會(huì)自動(dòng)從maven倉庫當(dāng)中下載指定的jar包逗宜,groupId、artifactId空骚、version的含義和上方的一模一樣纺讲。

dependencies-type:指定文件的后綴擴(kuò)展名,默認(rèn)是jar

dependencies-scope:與處理任務(wù)時(shí)相關(guān)的類路徑囤屹,如何限制依賴的傳遞性熬甚。有compile: 僅在編譯期間提供;provided:編譯器提供,并且說明到運(yùn)行的時(shí)候希望jdk或者容器提供它肋坚。runtime:僅僅在執(zhí)行期間提供乡括,如jdbc的驅(qū)動(dòng)。test:測試的編譯和執(zhí)行階段提供智厌。system:和provided相似诲泌,總是是可用的,不需要從倉庫當(dāng)中去查找铣鹏。

dependencies-systemPath:僅僅在scope為system的時(shí)候用敷扫,否則構(gòu)建就會(huì)報(bào)錯(cuò)。路徑必須是絕對(duì)的吝沫,指定特定的系統(tǒng)路徑呻澜,eg: ${JAVA_HOME},maven就不會(huì)從maven倉庫當(dāng)中查找,而是去 systemPath指定的路徑查找惨险。

depenpendencies-optional:當(dāng)一個(gè)項(xiàng)目A依賴另一個(gè)項(xiàng)目B時(shí)羹幸,項(xiàng)目A可能很少一部分功能用到了項(xiàng)目B,此時(shí)就可以在A中配置對(duì)B的可選依賴辫愉。舉例來說栅受,一個(gè)類似hibernate的項(xiàng)目,它支持對(duì)mysql、oracle等各種數(shù)據(jù)庫的支持屏镊,但是在引用這個(gè)項(xiàng)目時(shí)依疼,我們可能只用到其對(duì)mysql的支持,此時(shí)就可以在這個(gè)項(xiàng)目中配置可選依賴而芥,也就是說律罢,所依賴的項(xiàng)目可能下載也可能下載。

? ? 配置可選依賴的原因:1棍丐、節(jié)約磁盤误辑、內(nèi)存等空間;2歌逢、避免license許可問題巾钉;3、避免類路徑問題秘案,等等砰苍。

depenpendencies-exclusion:排除依賴,明確不依賴阱高、不下載赚导。

項(xiàng)目依賴

當(dāng)項(xiàng)目的packaging設(shè)置為pom的時(shí)候,常常用于父工程或者聚合工程(多個(gè)項(xiàng)目模塊)讨惩。pom可以繼承的配置:groupId version description url inceptionYear

organization licenses developers contributors mailingLists scm issueManagement ciManagement properties dependencyManagement dependencies repositories pluginRepositories build plugin executions with matching ids plugin configuration etc. reporting profiles

不會(huì)繼承的元素:artifactId name prerequisites

要注意的是:relativePath 并不是必須的辟癌,指明先在給出的路徑中去查找,如果找不到才會(huì)去本地或者遠(yuǎn)程倉庫當(dāng)中查找荐捻。

超級(jí)pom(super pom)

所有的pom都會(huì)繼承此pom,應(yīng)當(dāng)詳細(xì)了解該pom寡夹,可以通過mvn help:effective-pom來查看最后打包的pom处面,因?yàn)檫@會(huì)影響構(gòu)建的pom,該pom內(nèi)容如下:

<project>

? <modelVersion>4.0.0</modelVersion>

? <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>

? <pluginRepositories>

? ? <pluginRepository>

? ? ? <id>central</id>

? ? ? <name>Central Repository</name>

? ? ? <url>http://repo.maven.apache.org/maven2</url>

? ? ? <layout>default</layout>

? ? ? <snapshots>

? ? ? ? <enabled>false</enabled>

? ? ? </snapshots>

? ? ? <releases>

? ? ? ? <updatePolicy>never</updatePolicy>

? ? ? </releases>

? ? </pluginRepository>

? </pluginRepositories>

? <build>

? ? <directory>${project.basedir}/target</directory>

? ? <outputDirectory>${project.build.directory}/classes</outputDirectory>

? ? <finalName>${project.artifactId}-${project.version}</finalName>

? ? <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>

? ? <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>

? ? <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>

? ? <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>

? ? <resources>

? ? ? <resource>

? ? ? ? <directory>${project.basedir}/src/main/resources</directory>

? ? ? </resource>

? ? </resources>

? ? <testResources>

? ? ? <testResource>

? ? ? ? <directory>${project.basedir}/src/test/resources</directory>

? ? ? </testResource>

? ? </testResources>

? ? <pluginManagement>

? ? ? <!-- NOTE: These plugins will be removed from future versions of the super POM -->

? ? ? <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->

? ? ? <plugins>

? ? ? ? <plugin>

? ? ? ? ? <artifactId>maven-antrun-plugin</artifactId>

? ? ? ? ? <version>1.3</version>

? ? ? ? </plugin>

? ? ? ? <plugin>

? ? ? ? ? <artifactId>maven-assembly-plugin</artifactId>

? ? ? ? ? <version>2.2-beta-5</version>

? ? ? ? </plugin>

? ? ? ? <plugin>

? ? ? ? ? <artifactId>maven-dependency-plugin</artifactId>

? ? ? ? ? <version>2.1</version>

? ? ? ? </plugin>

? ? ? ? <plugin>

? ? ? ? ? <artifactId>maven-release-plugin</artifactId>

? ? ? ? ? <version>2.0</version>

? ? ? ? </plugin>

? ? ? </plugins>

? ? </pluginManagement>

? </build>


? <reporting>

? ? <outputDirectory>${project.build.directory}/site</outputDirectory>

? </reporting>


? <profiles>

? ? <!-- NOTE: The release profile will be removed from future versions of the super POM -->

? ? <profile>

? ? ? <id>release-profile</id>


? ? ? <activation>

? ? ? ? <property>

? ? ? ? ? <name>performRelease</name>

? ? ? ? ? <value>true</value>

? ? ? ? </property>

? ? ? </activation>


? ? ? <build>

? ? ? ? <plugins>

? ? ? ? ? <plugin>

? ? ? ? ? ? <inherited>true</inherited>

? ? ? ? ? ? <artifactId>maven-source-plugin</artifactId>

? ? ? ? ? ? <executions>

? ? ? ? ? ? ? <execution>

? ? ? ? ? ? ? ? <id>attach-sources</id>

? ? ? ? ? ? ? ? <goals>

? ? ? ? ? ? ? ? ? <goal>jar</goal>

? ? ? ? ? ? ? ? </goals>

? ? ? ? ? ? ? </execution>

? ? ? ? ? ? </executions>

? ? ? ? ? </plugin>

? ? ? ? ? <plugin>

? ? ? ? ? ? <inherited>true</inherited>

? ? ? ? ? ? <artifactId>maven-javadoc-plugin</artifactId>

? ? ? ? ? ? <executions>

? ? ? ? ? ? ? <execution>

? ? ? ? ? ? ? ? <id>attach-javadocs</id>

? ? ? ? ? ? ? ? <goals>

? ? ? ? ? ? ? ? ? <goal>jar</goal>

? ? ? ? ? ? ? ? </goals>

? ? ? ? ? ? ? </execution>

? ? ? ? ? ? </executions>

? ? ? ? ? </plugin>

? ? ? ? ? <plugin>

? ? ? ? ? ? <inherited>true</inherited>

? ? ? ? ? ? <artifactId>maven-deploy-plugin</artifactId>

? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? <updateReleaseInfo>true</updateReleaseInfo>

? ? ? ? ? ? </configuration>

? ? ? ? ? </plugin>

? ? ? ? </plugins>

? ? ? </build>

? ? </profile>

? </profiles>

</project>

依賴管理(dependencyManagement)

資料參見:https://www.cnblogs.com/feibazhf/p/7886617.html

主要管理版本菩掏,對(duì)于子類繼承同一個(gè)父類是很有用的魂角,集中管理依賴版本不添加依賴關(guān)系,對(duì)于其中定義的版本智绸,子pom不一定要繼承父pom所定義的版本野揪。

dependencies即使在子項(xiàng)目中不寫該依賴項(xiàng),那么子項(xiàng)目仍然會(huì)從父項(xiàng)目中繼承該依賴項(xiàng)(全部繼承)

dependencyManagement里只是聲明依賴瞧栗,并不實(shí)現(xiàn)引入斯稳,因此子項(xiàng)目需要顯示的聲明需要用的依賴。如果不在子項(xiàng)目中聲明依賴迹恐,是不會(huì)從父項(xiàng)目中繼承下來的挣惰;只有在子項(xiàng)目中寫了該依賴項(xiàng),并且沒有指定具體版本,才會(huì)從父項(xiàng)目中繼承該項(xiàng)憎茂,并且version和scope都讀取自父pom;另外如果子項(xiàng)目中指定了版本號(hào)珍语,那么會(huì)使用子項(xiàng)目中指定的jar版本。

eg:

<dependencyManagement>

? ? ? ? <dependencies>?

? ? ? ? ? ? <dependency>?

? ? ? ? ? ? ? ? <groupId>org.eclipse.persistence</groupId>?

? ? ? ? ? ? ? ? <artifactId>org.eclipse.persistence.jpa</artifactId>?

? ? ? ? ? ? ? ? <version>${org.eclipse.persistence.jpa.version}</version>?

? ? ? ? ? ? ? ? <scope>provided</scope>?

? ? ? ? ? ? </dependency>

? ? ? ? ? ? <dependency>?

? ? ? ? ? ? ? ? <groupId>javax</groupId>?

? ? ? ? ? ? ? ? <artifactId>javaee-api</artifactId>?

? ? ? ? ? ? ? ? <version>${javaee-api.version}</version>?

? ? ? ? ? ? </dependency>?

? ? ? ? </dependencies>?

? ? </dependencyManagement>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竖幔,一起剝皮案震驚了整個(gè)濱河市板乙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拳氢,老刑警劉巖亡驰,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饿幅,居然都是意外死亡凡辱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門栗恩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來透乾,“玉大人,你說我怎么就攤上這事磕秤「辜猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵互亮,是天一觀的道長愁铺。 經(jīng)常有香客問我,道長蒙兰,這世上最難降的妖魔是什么磷瘤? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮搜变,結(jié)果婚禮上采缚,老公的妹妹穿的比我還像新娘。我一直安慰自己挠他,他們只是感情好扳抽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殖侵,像睡著了一般贸呢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拢军,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天楞陷,我揣著相機(jī)與錄音,去河邊找鬼朴沿。 笑死猜谚,一個(gè)胖子當(dāng)著我的面吹牛败砂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播魏铅,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼昌犹,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了览芳?” 一聲冷哼從身側(cè)響起斜姥,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沧竟,沒想到半個(gè)月后铸敏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悟泵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年杈笔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕非。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒙具,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朽肥,到底是詐尸還是另有隱情禁筏,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布衡招,位于F島的核電站篱昔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏始腾。R本人自食惡果不足惜州刽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窘茁。 院中可真熱鬧怀伦,春花似錦、人聲如沸山林。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驼抹。三九已至,卻和暖如春拜鹤,著一層夾襖步出監(jiān)牢的瞬間框冀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工敏簿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留明也,地道東北人宣虾。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像温数,于是被迫代替她去往敵國和親绣硝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注釋 參考 0 前言 什么是...
    seyvoue閱讀 12,575評(píng)論 1 36
  • 昨天準(zhǔn)備就現(xiàn)在開發(fā)中的問題寫一個(gè)Maven插件撑刺,完成一些代碼的自動(dòng)生成鹉胖。在好幾年前寫過幾個(gè)插件,這次重新找開看后够傍,...
    jackzh閱讀 3,920評(píng)論 0 6
  • 創(chuàng)建父項(xiàng)目common-parentFile>>New>>Project>>Empty Project>>填寫項(xiàng)目...
    MicoCube閱讀 825評(píng)論 0 0
  • Maven概述 Maven定義Maven是一個(gè)項(xiàng)目管理和整合甫菠,統(tǒng)一管理jar包的工具;Maven為開發(fā)者提供了一套...
    THQ的簡書閱讀 793評(píng)論 0 0
  • 越南雄陽美協(xié)興榴蓮餅怎么樣冕屯?【貪吃二師兄】淘寶店寂诱,廠家授權(quán)! 購買請(qǐng)點(diǎn)擊 多買多優(yōu)惠活動(dòng)時(shí)間2018-10-10 ...
    袁狴犴淘寶貪吃二師兄閱讀 258評(píng)論 0 0