入門maven奈搜?本文足矣

以前開發(fā)的時(shí)候,如果A項(xiàng)目需要某個(gè)jar包盯荤,可能去網(wǎng)上搜索下載jar包馋吗,然后復(fù)制粘貼在開發(fā)對應(yīng)的位置,如果B項(xiàng)目也需要這個(gè)jar包秋秤,那么同樣需要再次手動(dòng)復(fù)制粘貼到對應(yīng)的位置宏粤。

為了解決這個(gè)問題脚翘,包管理應(yīng)運(yùn)而生,其中最通用以maven和gradle為主绍哎,前者主要側(cè)重于java項(xiàng)目来农,后者側(cè)重于android項(xiàng)目。注意崇堰,說的是側(cè)重于沃于,而不是就是。

什么是maven呢海诲,讓我們來看下官方定義

At first glance Maven can appear to be many things, but in a nutshell Maven is an attempt to apply patterns to a project's build infrastructure in order to promote comprehension and productivity by providing a clear path in the use of best practices. Maven is essentially a project management and comprehension tool and as such provides a way to help with managing:

  • Builds
  • Documentation
  • Reporting
  • Dependencies
  • SCMs
  • Releases
  • Distribution

If you want more background information on Maven you can check out The Philosophy of Maven and The History of Maven. Now let's move on to how you, the user, can benefit from using Maven.

通過官方定義我們可以知道m(xù)aven通俗來說就是管理項(xiàng)目周期的繁莹,包括了我們最常聽到的,編譯饿肺,下載蒋困,依賴,部署等敬辣。

如何下載安裝Maven

這一步我就不再贅述了雪标,網(wǎng)上隨便一搜就是一大堆

image

如何驗(yàn)證下載安裝是否成功呢(一般是配了系統(tǒng)環(huán)境的),在命令行的任一個(gè)目錄下輸入mvn -v 溉跃,出現(xiàn)類似以下信息則說明配置成功村刨,包括了mvn的版本號(hào)。

image

基本概念和配置

在構(gòu)建一個(gè)maven應(yīng)用之前可以先來講下關(guān)于倉庫的基本概念和一些必要的配置撰茎。

  • 本地倉庫:在本地pc中劃分一個(gè)文件夾來存儲(chǔ)jar包

  • 中心倉庫:maven官方統(tǒng)一管理jar包的倉庫

  • 遠(yuǎn)程倉庫:自己或者公司搭建的給內(nèi)部團(tuán)隊(duì)使用的jar包的倉庫

image

當(dāng)引入一個(gè)依賴的時(shí)候

  1. 去本地倉庫尋找是否有jar包

  2. 如果沒有則去maven管理的中心倉庫去尋找

  3. 如果中央倉庫還沒有嵌牺,就會(huì)去遠(yuǎn)程倉庫尋找,如果連遠(yuǎn)程倉庫都沒有創(chuàng)建龄糊,那么直接拋出錯(cuò)誤逆粹,找不到依賴

  4. 有遠(yuǎn)程倉庫,但是遠(yuǎn)程倉庫也找不到需要的jar包炫惩,同樣會(huì)拋出錯(cuò)誤僻弹,找不到依賴

除此之外,還有一個(gè)鏡像的概念他嚷,只要倉庫A能夠包含倉庫B所有的jar包蹋绽,那么就可以說A是B的鏡像。由于一些不可抗因素筋蓖,有時(shí)候訪問不了中心倉庫卸耘,這時(shí)候就需要用阿里云或者其他的鏡像倉庫來提高訪問效率。

目前為止只需要了解這幾個(gè)概念粘咖,了解完后就是進(jìn)行設(shè)置蚣抗,對本地倉庫的位置、鏡像倉庫的url和遠(yuǎn)程倉庫的url設(shè)置瓮下。

默認(rèn)的配置文件路徑是${user.home}/.m2/settings.xml 翰铡,默認(rèn)的本地倉庫地址是${user.home}/.m2/repository/

image

可以看到有兩個(gè)層級(jí)设哗,一個(gè)是用戶級(jí)別的修改,那么配置文件就是對應(yīng)${user.home}/.m2/settings.xml两蟀,另外一個(gè)是全局修改,也就是對所有用戶都生效震缭,那么配置文件的路徑對應(yīng)的則是${maven.home}/conf/settings.xml

修改本地倉庫位置

image

添加鏡像地址

image

配置遠(yuǎn)程倉庫

image

在配置鏡像和遠(yuǎn)程倉庫的時(shí)候赂毯,記得id標(biāo)簽是全局唯一的

查看當(dāng)前生效的配置文件,可以采用mvn help:effective-settings

image

可以看到配置文件中去掉了多余注釋的部分拣宰,只留下了剛才手動(dòng)配置的本地倉庫和鏡像倉庫的位置党涕。

搭建第一個(gè)maven應(yīng)用

使用命令行來搭建第一個(gè)maven應(yīng)用,以后可能99.99%的情況都是直接通過idea來搭建

image

mvn -B archetype:generate -DgroupId=com.maven.learn.cutey -DartifactId=my-first-maven -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

可以先不管這串命令是啥意思巡社,等后面講了再回過頭來看會(huì)有種不一樣的感覺膛堤,生成項(xiàng)目后使用tree來看項(xiàng)目的目錄結(jié)構(gòu)長啥樣

image

有個(gè)pom.xml,也就是后面常說的pom文件晌该,全名Project Object Model 項(xiàng)目對象模型文件肥荔,描述這個(gè)項(xiàng)目的。

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="xml" cid="n71" mdtype="fences" style="font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); position: relative !important; background-position: inherit; background-repeat: inherit;"><?xml version="1.0" encoding="UTF-8"?>

<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>com.maven.learn.cutey</groupId>
<artifactId>my-first-maven</artifactId>
<version>1.0-SNAPSHOT</version>

<name>my-first-maven</name>

<url>http://www.example.com</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>

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

<build>

</build>
</project>
</pre>

有幾個(gè)非常常用的標(biāo)簽

  • groupId 也就是組織id朝群,一般是公司的域名倒寫

  • artifactId 可以簡單的理解為項(xiàng)目id燕耿,一般是通過groupId:artifactId 來定位一個(gè)jar包

  • dependencies 依賴,可以通俗的理解為jar包

其他的都可以顧名思義姜胖,這里就不再一一解釋誉帅。

常用命令

編譯 compile

在往常會(huì)使用javac來編譯得到class文件來執(zhí)行,在maven中也有類似的命令右莱,使用mvn compile 對項(xiàng)目進(jìn)行編譯蚜锨。編譯完成后再看下文件目錄結(jié)構(gòu),可以發(fā)現(xiàn)多了target目錄慢蜓,然后對應(yīng)的路徑上也有了class文件亚再。

image

進(jìn)到classes文件夾下,使用java命令行啟動(dòng)java文件胀瞪,可以發(fā)現(xiàn)能正常運(yùn)行

image

測試 test

在上面的目錄結(jié)構(gòu)中针余,除了main文件夾,還有一個(gè)test文件夾目錄凄诞,也就是常說的測試用例目錄圆雁。

image

默認(rèn)的測試用例比較簡單,沒有什么好說的帆谍∥毙啵可以使用mvn test 來運(yùn)行測試用例

image

測試用例能夠跑成功,然后再次使用tree來看下目錄結(jié)構(gòu)

image

可以看到又增加了一些文件汛蝙,其中surefire-reports是maven的一個(gè)插件烈涮。還有一個(gè)值得注意的點(diǎn)是看到了testCompile朴肺,說明是mvn test 也是經(jīng)過編譯后才運(yùn)行的

image

那么mvn test-compile 即可達(dá)到只編譯不運(yùn)行的效果。

打包 package

真實(shí)情況下一般是不會(huì)編譯所有的文件坚洽,然后放在服務(wù)器上跑class文件的戈稿,而是把項(xiàng)目打包成一個(gè)jar包運(yùn)行,或者打成war包部署在服務(wù)器的tomcat上運(yùn)行讶舰。

使用mvn package 即可按照進(jìn)行打包鞍盗,打包完后使用tree 查看目錄結(jié)構(gòu)

image

赫然可以看到有個(gè)jar包生成,然后使用java -jar命令行執(zhí)行jar包跳昼。但是般甲,在這個(gè)例子里是會(huì)報(bào)錯(cuò)的

image

上網(wǎng)查找資料后發(fā)現(xiàn)是缺少了主啟動(dòng)類的入口鹅颊,不過在之后的springboot項(xiàng)目中沒有這種煩惱敷存,應(yīng)該是已經(jīng)配好了,感興趣的同學(xué)可以一層一層地看下spring的pom文件堪伍。解決方法是在pom文件加入以下代碼锚烦。

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="xml" cid="n104" mdtype="fences" style="font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); position: relative !important; background-position: inherit; background-repeat: inherit;"><plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.maven.learn.cutey.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins></pre>

image

注意<plugins>是放在build標(biāo)簽下,而不是pluginManagement標(biāo)簽下

再來使用java -jar 執(zhí)行jar包帝雇,可以看到能夠正確執(zhí)行挽牢。

image

下載到本地 install

完成了以上的工作后,去本地的jar包上看是還沒有的摊求。

image

但是在現(xiàn)實(shí)的開發(fā)環(huán)境中禽拔,一個(gè)project是由多個(gè)module組成的,各個(gè)module之間可能需要引用依賴室叉,這就可能要求把開發(fā)好的module下載到本地供其他module使用睹栖。使用mvn install 即可完成上述要求

image

可以看到在對應(yīng)的位置上已經(jīng)生成了jar包以及對應(yīng)的版本號(hào)等,而所謂對應(yīng)的位置也就是由我們一開始自定義的groupId和artifactId共同組成茧痕。

清除target目錄 clean

有些情況下可能需要清除編譯生成的二進(jìn)制文件野来,然后再編譯,這就需要用到mvn clean

image

可以看到清楚完后踪旷,目錄結(jié)構(gòu)又變得很干凈了曼氛。但是,注意令野,雖然target目錄清空了舀患,install下載jar包到本地的jar包在本地倉庫還是存在的。

骨架 archetype

archetype 的意思是原型气破,可以理解為模版或者骨架聊浅,但更本質(zhì)地來說,它就是maven的一個(gè)插件。一開始搭建的第一個(gè)maven應(yīng)用就是用到了archetype低匙,但是是在命令行中配好了選擇哪個(gè)模版(maven-archetype-quickstart)旷痕,然后把groupId和artifactId都輸入了。

mvn -B archetype:generate -DgroupId=com.maven.learn.cutey -DartifactId=my-first-maven -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

這次試試不自動(dòng)生成顽冶,采用mvn archetype:generate

image

出現(xiàn)了警告欺抗,說是在遠(yuǎn)程編錄中找不到骨架,只加載了本地的强重,所以我們只看到了10個(gè)internal的骨架佩迟,但是這不妨礙下來的動(dòng)作。所以這個(gè)報(bào)警可以不用管竿屹,如果有強(qiáng)迫癥的小伙可以上網(wǎng)搜下解決方案。

默認(rèn)選擇是7灸姊,一看第7個(gè)拱燃,就是maven-archetype-quickstart ,這次為了不同力惯,我手動(dòng)選擇10碗誉,也就是maven-archetype-webapp ,顧名思義就是web項(xiàng)目父晶。

image

選擇完骨架后就是去倉庫進(jìn)行下載哮缺,并且讓你填寫groupId和artifactId和一些基本值

image

查看下目錄結(jié)構(gòu)

image

自定義骨架

上面兩個(gè)例子都是采用別人的骨架,但是能夠自定義骨架呢甲喝,maven是提供這種支持的尝苇。

首先生成骨架,在項(xiàng)目的根目錄下埠胖,也就是和pom文件同級(jí)的目錄下采用mvn archetype:create-from-project

目錄結(jié)構(gòu)如下

image

其次切到target 中的archetype目錄下糠溜,先執(zhí)行mvn install ,再執(zhí)行mvn archetype:crawl

image

Build success后去前面設(shè)置的倉庫根目錄下

image

可以看到多出了一個(gè)archetype-catalog.xml 文件直撤,查看該文件內(nèi)容

image

可以看到最新的非竿,自定義的archetype也在該文件下,下面就嘗試看能不能成功使用自定義的骨架生成一個(gè)項(xiàng)目谋竖,照樣執(zhí)行mvn archetype:generate

image

可以看到第11個(gè)就是我們自己的archetype红柱,同時(shí)可以發(fā)現(xiàn),每個(gè)數(shù)字后面都跟著一個(gè)英文蓖乘,internal或者local锤悄,其實(shí)還有一個(gè)remote。有時(shí)候我們只想要local嘉抒,或者只想要remote铁蹈,maven也提供了這樣的命令加一個(gè)-DarchetypeCatalog=xxx 即可。

比如,mvn archetype:generate -DarchetypeCatalog=local 就是只加載本地的骨架

image

途中默認(rèn)選擇的是2握牧,但是3才是自定義的容诬,同樣輸入一些必要的信息

image

創(chuàng)作不易,如果對你有幫助沿腰,歡迎點(diǎn)贊览徒,收藏和分享啦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颂龙,一起剝皮案震驚了整個(gè)濱河市习蓬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌措嵌,老刑警劉巖躲叼,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異企巢,居然都是意外死亡枫慷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門浪规,熙熙樓的掌柜王于貴愁眉苦臉地迎上來或听,“玉大人,你說我怎么就攤上這事笋婿∮桑” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵缸濒,是天一觀的道長足丢。 經(jīng)常有香客問我,道長庇配,這世上最難降的妖魔是什么霎桅? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮讨永,結(jié)果婚禮上滔驶,老公的妹妹穿的比我還像新娘。我一直安慰自己卿闹,他們只是感情好揭糕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锻霎,像睡著了一般著角。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旋恼,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天吏口,我揣著相機(jī)與錄音,去河邊找鬼。 笑死产徊,一個(gè)胖子當(dāng)著我的面吹牛昂勒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舟铜,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼戈盈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谆刨?” 一聲冷哼從身側(cè)響起塘娶,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痊夭,沒想到半個(gè)月后刁岸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡她我,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年虹曙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸦难。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖员淫,靈堂內(nèi)的尸體忽然破棺而出合蔽,到底是詐尸還是另有隱情,我是刑警寧澤介返,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布拴事,位于F島的核電站,受9級(jí)特大地震影響圣蝎,放射性物質(zhì)發(fā)生泄漏刃宵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一徘公、第九天 我趴在偏房一處隱蔽的房頂上張望牲证。 院中可真熱鬧,春花似錦关面、人聲如沸坦袍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捂齐。三九已至,卻和暖如春缩抡,著一層夾襖步出監(jiān)牢的瞬間奠宜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留压真,地道東北人娩嚼。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像榴都,于是被迫代替她去往敵國和親待锈。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

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

  • 轉(zhuǎn)自: https://www.cnblogs.com/yjmyzz/p/3495762.html 一嘴高、下載及安裝...
    程序和遠(yuǎn)方閱讀 228評(píng)論 0 0
  • maven快速入門 一竿音、Maven 介紹 1、啥是 maven 拴驮? Maven是一個(gè)項(xiàng)目管理工具春瞬,它包含了這些邏輯...
    Actadd閱讀 370評(píng)論 0 0
  • maven快速入門 一、Maven 介紹 1套啤、啥是 maven 宽气? Maven是一個(gè)項(xiàng)目管理工具,它包含了這些邏輯...
    Actadd閱讀 307評(píng)論 0 0
  • Apache Maven,是一個(gè)軟件(特別是Java軟件)項(xiàng)目管理及自動(dòng)構(gòu)建工具唆鸡,由Apache軟件基金會(huì)所提供涝影。...
    cqzhangjian閱讀 1,596評(píng)論 0 51
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn)争占,但是人生放棄了冒險(xiǎn)燃逻,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,041評(píng)論 0 4