Maven 基礎(chǔ)

是什么

Maven是一個(gè)Java項(xiàng)目管理和構(gòu)建工具澳腹,它可以定義項(xiàng)目結(jié)構(gòu)织盼、項(xiàng)目依賴,并使用統(tǒng)一的方式進(jìn)行自動(dòng)化構(gòu)建酱塔,是Java項(xiàng)目不可缺少的工具沥邻。

重點(diǎn)詞:

  • Java
  • 解決依賴問(wèn)題
  • 標(biāo)準(zhǔn)結(jié)構(gòu)
  • 構(gòu)建(build)

安裝配置

安裝

前提:Java(JDK)已經(jīng)安裝。

官方下載地址:http://maven.apache.org/download.cgi

$ wget http://apache.mirrors.spacedump.net/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
$ tar -xvf  apache-maven-3.6.3-bin.tar.gz
$ sudo mv -f apache-maven-3.6.3 /usr/local/

修改用戶環(huán)境變量

vi ~/.bash_profile

export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=${PATH}:${MAVEN_HOME}/bin
source ~/.bash_profile
mvn -v

設(shè)置MAVEN_OPTS環(huán)境變量

防止運(yùn)行Java時(shí)內(nèi)存溢出

export MAVEN_OPTS="-Xms128m  -Xmx512m"

settings.xml

全局配置 ${MAVEN_HOME}/conf/settings.xml 或者用戶配置 ~/.m2/settings.xml

比如從新定義本地倉(cāng)庫(kù)羊娃。(默認(rèn)是~/.m2/repository/)

<settings>
...
  <localRepository>/localdisk/repository</localRepository>
...
</settings>

還可以設(shè)置http代理唐全。

<settings>  
  ...  
  <proxies>  
    <proxy>  
      <id>my-proxy</id>  
      <active>true</active>  
      <protocol>http</protocol>  
      <host>218.14.227.137</host>  
      <port>3128</port>  
      <!--  
        <username>***</username>  
        <password>***</password>  
        <nonProxyHosts>  
          repository.mycom.com|*.google.com  
        </nonProxyHosts>  
      -->  
    </proxy>  
  </proxies>  
  ...  
</settings> 

Maven項(xiàng)目結(jié)構(gòu)

a-maven-project
├─ src
│ ├─ main          存放主程序
│ │ ├─ java        存放Java源文件
│ │ ├─ resources   存放框架或其他工具的配置文件
│ ├─ test          存放測(cè)試程序
│ │ ├─ java        存放Java測(cè)試的源文件
│ │ ├─ resources   存放測(cè)試的配置文件
├─pom.xml          Maven工程的核心配置

Maven Hello World

Maven 使用原型 archetype 插件創(chuàng)建項(xiàng)目。要?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的 Java 應(yīng)用,我們將使用 maven-archetype-quickstart 插件邮利。

在下面的例子中弥雹,創(chuàng)建一個(gè)基于 maven 的 java 應(yīng)用項(xiàng)目。

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

參數(shù)說(shuō)明:

  • -DgourpId: 組織名,公司網(wǎng)址的反寫 + 項(xiàng)目名稱
  • -DartifactId: 項(xiàng)目名-模塊名
  • -DarchetypeArtifactId: 指定 ArchetypeId头朱,maven-archetype-quickstart,創(chuàng)建一個(gè)簡(jiǎn)單的 Java 應(yīng)用
  • -DinteractiveMode: 是否使用交互模式

創(chuàng)建了之前命令行中給 artifactId 定義的新目錄,結(jié)構(gòu)如下:

.
└── my-app
    ├── pom.xml
    └── src
        ├── main
        │   └── java
        │       └── com
        │           └── mycompany
        │               └── app
        │                   └── App.java
        └── test
            └── java
                └── com
                    └── mycompany
                        └── app
                            └── AppTest.java

進(jìn)入這個(gè)目錄,直接compile

$ cd my-app
$ mvn compile

POM 文件

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.google</groupId>
    <artifactId>springBootDemo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springBootDemo1</name>
</project>

根元素下的第一個(gè)子元素modelVersion指定了當(dāng)前的POM模型的版本,對(duì)于Maven3來(lái)說(shuō),它只能是4.0.0.

groupId 定義了項(xiàng)目屬于哪個(gè)組織水由。

artifactId 定義了當(dāng)前Maven項(xiàng)目在組中唯一的ID,比如定義hello-world呵恢。

version 指定了項(xiàng)目當(dāng)前的版本0.0.1-SNAPSHOT,SNAPSHOT意為快照,說(shuō)明該項(xiàng)目還處于開(kāi)發(fā)中声离,是不穩(wěn)定的。

name 申明了一個(gè)對(duì)于用戶更為友好的項(xiàng)目名稱盅安,雖然這不是必須的蝙寨,但還是推薦為每個(gè)POM聲明name,以方便信息交流

依賴

一個(gè)Maven工程就是由groupIdartifactIdversion作為唯一標(biāo)識(shí)。我們?cè)谝闷渌谌綆?kù)的時(shí)候毕源,也是通過(guò)這3個(gè)變量確定。例如冻璃,依賴commons-logging

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
    <scope>system</scope> <!--作用域-->
    <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath> <!--項(xiàng)目根目錄下的lib文件夾下-->
</dependency>

使用<dependency>聲明一個(gè)依賴后,Maven就會(huì)自動(dòng)下載這個(gè)依賴包并把它放到classpath中。

Maven常用命令說(shuō)明

  • mvn clean:表示運(yùn)行清理操作(會(huì)默認(rèn)把target文件夾中的數(shù)據(jù)清理)棉圈。
  • mvn clean compile:表示先運(yùn)行清理之后運(yùn)行編譯吁系,會(huì)將代碼編譯到target文件夾中。
  • mvn clean test:運(yùn)行清理和測(cè)試。
  • mvn clean package:運(yùn)行清理和打包呆瞻。
  • mvn clean install:運(yùn)行清理和安裝挺狰,會(huì)將打好的包安裝到本地倉(cāng)庫(kù)中,以便其他的項(xiàng)目可以調(diào)用。
  • mvn clean deploy:運(yùn)行清理和發(fā)布(發(fā)布到私服上面)。

上面的命令大部分都是連寫的,大家也可以拆分分別執(zhí)行痒蓬,這是活的,看個(gè)人喜好以及使用需求。執(zhí)行test之前是會(huì)先執(zhí)行compile,執(zhí)行package之前會(huì)先執(zhí)行test破喻,而類似的,install之前會(huì)執(zhí)行package。

倉(cāng)庫(kù)的分類

160b27fd1730a299.png

中央倉(cāng)庫(kù)

其實(shí)我們使用的大多數(shù)第三方模塊都是這個(gè)用法,例如,我們使用commons logging绰咽、log4j這些第三方模塊笑跛,就是第三方模塊的開(kāi)發(fā)者自己把編譯好的jar包發(fā)布到Maven的中央倉(cāng)庫(kù)中陈哑。

私有倉(cāng)庫(kù)

私有倉(cāng)庫(kù)是指公司內(nèi)部如果不希望把源碼和jar包放到公網(wǎng)上,那么可以搭建私有倉(cāng)庫(kù)。私有倉(cāng)庫(kù)總是在公司內(nèi)部使用执解,它只需要在本地的~/.m2/settings.xml中配置好,使用方式和中央倉(cāng)位沒(méi)有任何區(qū)別。

本地倉(cāng)庫(kù)

本地倉(cāng)庫(kù)是指把本地開(kāi)發(fā)的項(xiàng)目“發(fā)布”在本地莫鸭,這樣其他項(xiàng)目可以通過(guò)本地倉(cāng)庫(kù)引用它堕花。但是我們不推薦把自己的模塊安裝到Maven的本地倉(cāng)庫(kù)苏研,因?yàn)槊看涡薷哪硞€(gè)模塊的源碼,都需要重新安裝援奢,非常容易出現(xiàn)版本不一致的情況纬霞。更好的方法是使用模塊化編譯,在編譯的時(shí)候胳蛮,告訴Maven幾個(gè)模塊之間存在依賴關(guān)系瓶竭,需要一塊編譯瓷叫,Maven就會(huì)自動(dòng)按依賴順序編譯這些模塊蔽介。

發(fā)布到私有倉(cāng)庫(kù)

使用Artifact的Token只需要read:packages權(quán)限坐儿。

在發(fā)布端貌矿,把GitHub的用戶名和發(fā)布Token寫入~/.m2/settings.xml配置中:

<settings ...>
    ...
    <servers>
        <server>
            <id>github-release</id>
            <username>GITHUB-USERNAME</username>
            <password>f052...c21f</password>
        </server>
    </servers>
</settings>

然后,在需要發(fā)布的Artifact的pom.xml中尽楔,添加一個(gè)<repository>聲明:

<project ...>
    ...
    <distributionManagement>
        <repository>
            <id>github-release</id>
            <name>GitHub Release</name>
            <url>https://maven.pkg.github.com/michaelliao/complex</url>
        </repository>
    </distributionManagement>
</project>

注意到<id>~/.m2/settings.xml配置中的<id>要保持一致玛荞,因?yàn)榘l(fā)布時(shí)Maven根據(jù)id找到用于登錄的用戶名和Token客蹋,才能成功上傳文件到GitHub。我們直接通過(guò)命令mvn clean package deploy部署婉烟。

參考

https://maven.apache.org/pom.html#

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

https://www.runoob.com/maven/maven-tutorial.html

https://www.liaoxuefeng.com/wiki/1252599548343744/1309301243117601

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末华糖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瘟裸,更是在濱河造成了極大的恐慌客叉,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兼搏,居然都是意外死亡卵慰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門佛呻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)裳朋,“玉大人,你說(shuō)我怎么就攤上這事吓著±鸬眨” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵绑莺,是天一觀的道長(zhǎng)暖眼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)紊撕,這世上最難降的妖魔是什么罢荡? 我笑而不...
    開(kāi)封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任赡突,我火速辦了婚禮对扶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惭缰。我一直安慰自己浪南,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布漱受。 她就那樣靜靜地躺著络凿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昂羡。 梳的紋絲不亂的頭發(fā)上絮记,一...
    開(kāi)封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音虐先,去河邊找鬼怨愤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛹批,可吹牛的內(nèi)容都是我干的撰洗。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腐芍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼差导!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起猪勇,我...
    開(kāi)封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤设褐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體助析,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裁替,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了貌笨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弱判。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锥惋,靈堂內(nèi)的尸體忽然破棺而出昌腰,到底是詐尸還是另有隱情,我是刑警寧澤膀跌,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布遭商,位于F島的核電站,受9級(jí)特大地震影響捅伤,放射性物質(zhì)發(fā)生泄漏劫流。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一丛忆、第九天 我趴在偏房一處隱蔽的房頂上張望祠汇。 院中可真熱鬧,春花似錦熄诡、人聲如沸可很。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)我抠。三九已至,卻和暖如春袜茧,著一層夾襖步出監(jiān)牢的瞬間菜拓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工笛厦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纳鼎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓递递,卻偏偏與公主長(zhǎng)得像喷橙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子登舞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350