maven總結(jié)

maven教程

1、maven是什么?

maven是一個項(xiàng)目管理工具,可以對java項(xiàng)目進(jìn)行構(gòu)建邦蜜、依賴管理独泞。是 Apache 下的一個純 Java 開發(fā)的開源項(xiàng)目。也可被用來構(gòu)建和管理各種項(xiàng)目信不,如C#嘲叔,Ruby,Scala 和其他語言編寫的項(xiàng)目抽活。它是基于項(xiàng)目對象模型(縮寫:POM)概念硫戈,管理一個項(xiàng)目的構(gòu)建、報告和文檔等步驟下硕。

2丁逝、maven pom

POM( Project Object Model,項(xiàng)目對象模型 ) 是 Maven 工程的基本工作單元梭姓,是一個XML文件霜幼,包含了項(xiàng)目的基本信息,用于描述項(xiàng)目如何構(gòu)建誉尖,聲明項(xiàng)目依賴辛掠,等等。maven讀取pom獲取信息释牺,來執(zhí)行目標(biāo)萝衩。

POM 中可以指定以下配置:

  • 項(xiàng)目依賴
  • 插件
  • 執(zhí)行目標(biāo)
  • 項(xiàng)目構(gòu)建 profile
  • 項(xiàng)目版本
  • 項(xiàng)目開發(fā)者列表
  • 相關(guān)郵件列表信息
2.1、父pom

父(Super)POM是 Maven 默認(rèn)的 POM没咙。所有的 POM 都繼承自一個父 POM(無論是否顯式定義了這個父 POM)猩谊。父 POM 包含了一些可以被繼承的 默認(rèn)設(shè)置。因此祭刚,當(dāng) Maven 發(fā)現(xiàn)需要下載 POM 中的 依賴時牌捷,它會到 Super POM 中配置的默認(rèn)倉庫 http://repo1.maven.org/maven2 去下載墙牌。

Maven 使用 effective pom(Super pom 加上工程自己的配置)來執(zhí)行相關(guān)的目標(biāo),它幫助開發(fā)者在 pom.xml 中做盡可能少的配置暗甥,當(dāng)然這些配置可以被重寫喜滨。

使用以下命令來mvn help:effective-pom會在控制臺看到父pom的默認(rèn)配置。

在父 pom.xml 中撤防,你可以看到 Maven 在執(zhí)行目標(biāo)時需要用到的工程源碼目錄結(jié)構(gòu)虽风、輸出目錄、需要的插件寄月、倉庫和報表目錄辜膝。

pom中可使用的標(biāo)簽大全可以在這個網(wǎng)頁看到https://www.runoob.com/maven/maven-pom.html,當(dāng)然建議看官網(wǎng)最好漾肮。

3场仲、maven構(gòu)建生命周期

Maven 構(gòu)建生命周期定義了一個項(xiàng)目構(gòu)建跟發(fā)布的過程榴捡。Maven 有以下三個標(biāo)準(zhǔn)的生命周期:

  • clean:項(xiàng)目清理的處理
  • default(或 build):項(xiàng)目部署的處理
  • site:項(xiàng)目站點(diǎn)文檔創(chuàng)建的處理

default(或 build)生命周期是開發(fā)過程中最主要最常接觸到的切蟋,它由以下幾個階段(phase)的序列組成:


default(或 build)生命周期包含的階段(phase)

說得通透一點(diǎn)焰宣,maven構(gòu)建過程可以理解成,由各種plugin按照部分或全部的生命周期的階段(phase)順序執(zhí)行階段綁定的goal(底層是插件中的java方法)來完成java項(xiàng)目清理谭溉、編譯墙懂、打包、測試夜只、布署等整個項(xiàng)目的流程的一個過程垒在。在一個生命周期中蒜魄,運(yùn)行某個階段的時候扔亥,它之前的所有階段都會被運(yùn)行。

生命周期(lifecycle)由各個階段組成谈为,每個階段由maven的插件plugin來執(zhí)行g(shù)oal完成旅挤。

3.1 構(gòu)建階段(phase)由插件目標(biāo)(goal)構(gòu)成

一個插件目標(biāo)代表一個特定的任務(wù)(比構(gòu)建階段更為精細(xì)),這有助于項(xiàng)目的構(gòu)建和管理伞鲫。這些目標(biāo)可能被綁定到多個階段或者無綁定粘茄。不綁定到任何構(gòu)建階段的目標(biāo)可以在構(gòu)建生命周期之外通過直接調(diào)用執(zhí)行。這些目標(biāo)的執(zhí)行順序取決于調(diào)用目標(biāo)和構(gòu)建階段的順序秕脓。

例如柒瓣,考慮下面的命令:
mvn clean dependency:copy-dependencies package

clean 和 pakage 是構(gòu)建階段,dependency:copy-dependencies 是目標(biāo)吠架。這里的 clean 階段將會被首先執(zhí)行芙贫,然后 dependency:copy-dependencies 目標(biāo)會被執(zhí)行,最終 package 階段被執(zhí)行傍药。

4磺平、maven構(gòu)建配置文件

構(gòu)建配置文件是一系列的配置項(xiàng)的值魂仍,可以用來設(shè)置或者覆蓋 Maven 構(gòu)建默認(rèn)值。

使用構(gòu)建配置文件拣挪,你可以為不同的環(huán)境擦酌,比如說生產(chǎn)環(huán)境(Production)和開發(fā)(Development)環(huán)境,定制構(gòu)建方式菠劝。

配置文件在 pom.xml 文件中使用 activeProfiles 或者 profiles 元素指定赊舶,并且可以通過各種方式觸發(fā)。配置文件在構(gòu)建時修改 POM闸英,并且用來給參數(shù)設(shè)定不同的目標(biāo)環(huán)境(比如說锯岖,開發(fā)(Development)、測試(Testing)和生產(chǎn)環(huán)境(Production)中數(shù)據(jù)庫服務(wù)器的地址)甫何。

配置文件級別和激活方式
4.1 命令行配置文件激活

profile 可以讓我們定義一系列的配置信息出吹,然后指定其激活條件。這樣我們就可以定義多個 profile辙喂,然后每個 profile 對應(yīng)不同的激活條件和配置信息捶牢,從而達(dá)到不同環(huán)境使用不同配置信息的效果。

以下實(shí)例巍耗,我們將 maven-antrun-plugin:run 目標(biāo)添加到測試階段中秋麸。這樣我們可以在不同的 profile 中輸出文本信息。我們將使用 pom.xml 來定義不同的 profile炬太,并在命令控制臺中使用 maven 命令激活 profile灸蟆。

pom.xml 文件如下:

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.jsoft.test</groupId>
  <artifactId>testproject</artifactId>
  <packaging>jar</packaging>
  <version>0.1-SNAPSHOT</version>
  <name>testproject</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <profiles>
      <profile>
          <id>test</id>
          <build>
              <plugins>
                 <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.8</version>
                    <executions>
                       <execution>
                          <phase>test</phase>
                          <goals>
                             <goal>run</goal>
                          </goals>
                          <configuration>
                          <tasks>
                             <echo>Using env.test.properties</echo>
                             <copy file="src/main/resources/env.test.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
                          </tasks>
                          </configuration>
                       </execution>
                    </executions>
                 </plugin>
              </plugins>
          </build>
      </profile>
      <profile>
          <id>normal</id>
          <build>
              <plugins>
                 <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.8</version>
                    <executions>
                       <execution>
                          <phase>test</phase>
                          <goals>
                             <goal>run</goal>
                          </goals>
                          <configuration>
                          <tasks>
                             <echo>Using env.properties</echo>
                             <copy file="src/main/resources/env.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
                          </tasks>
                          </configuration>
                       </execution>
                    </executions>
                 </plugin>
              </plugins>
          </build>
      </profile>
      <profile>
          <id>prod</id>
          <build>
              <plugins>
                 <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.8</version>
                    <executions>
                       <execution>
                          <phase>test</phase>
                          <goals>
                             <goal>run</goal>
                          </goals>
                          <configuration>
                          <tasks>
                             <echo>Using env.prod.properties</echo>
                             <copy file="src/main/resources/env.prod.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
                          </tasks>
                          </configuration>
                       </execution>
                    </executions>
                 </plugin>
              </plugins>
          </build>
      </profile>
   </profiles>
</project>

注意:構(gòu)建配置文件采用的是 <profiles> 節(jié)點(diǎn)。

說明:上面新建了三個 <profiles>亲族,其中 <id> 區(qū)分了不同的 <profiles> 執(zhí)行不同的 AntRun 任務(wù)炒考;而 AntRun 的任務(wù)可以這么理解,AntRun 監(jiān)聽 test 的 Maven 生命周期階段霎迫,當(dāng) Maven 執(zhí)行 test 時斋枢,就觸發(fā)了 AntRun 的任務(wù),任務(wù)里面為輸出文本并復(fù)制文件到指定的位置知给;而至于要執(zhí)行哪個 AntRun 任務(wù)瓤帚,此時構(gòu)建配置文件起到了傳輸指定的作用,比如涩赢,通過命令行參數(shù)輸入指定的 <id>戈次。

執(zhí)行命令:mvn test -Ptest
提示:第一個 test 為 Maven 生命周期階段,第 2 個 test 為構(gòu)建配置文件指定的 <id> 參數(shù)筒扒,這個參數(shù)通過 -P 來傳輸怯邪,當(dāng)然,它可以是 prod 或者 normal 霎肯。

4.2擎颖、通過Maven設(shè)置激活配置文件
<settings 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/settings-1.0.0.xsd">
   ...
   <activeProfiles>
      <activeProfile>test</activeProfile>
   </activeProfiles>
</settings>
4.3 通過環(huán)境變量激活配置文件

先把上一步測試的 setting.xml 值全部去掉榛斯。

然后在 pom.xml 里面的 <id> 為 test 的 <profile> 節(jié)點(diǎn),加入 <activation> 節(jié)點(diǎn):

<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/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.jsoft.test</groupId>
 <artifactId>testproject</artifactId>
 <packaging>jar</packaging>
 <version>0.1-SNAPSHOT</version>
 <name>testproject</name>
 <url>http://maven.apache.org</url>
 <dependencies>
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>3.8.1</version>
     <scope>test</scope>
   </dependency>
 </dependencies>
 <profiles>
     <profile>
         <id>test</id>
         <activation>
           <property>
              <name>env</name>
              <value>test</value>
           </property>
         </activation>
         <build>
             <plugins>
                <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-antrun-plugin</artifactId>
                   <version>1.8</version>
                   <executions>
                      <execution>
                         <phase>test</phase>
                         <goals>
                            <goal>run</goal>
                         </goals>
                         <configuration>
                         <tasks>
                            <echo>Using env.test.properties</echo>
                            <copy file="src/main/resources/env.test.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
                         </tasks>
                         </configuration>
                      </execution>
                   </executions>
                </plugin>
             </plugins>
         </build>
     </profile>
     
     <profile>
         <id>prod</id>
         <build>
             <plugins>
                <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-antrun-plugin</artifactId>
                   <version>1.8</version>
                   <executions>
                      <execution>
                         <phase>test</phase>
                         <goals>
                            <goal>run</goal>
                         </goals>
                         <configuration>
                         <tasks>
                            <echo>Using env.prod.properties</echo>
                            <copy file="src/main/resources/env.prod.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
                         </tasks>
                         </configuration>
                      </execution>
                   </executions>
                </plugin>
             </plugins>
         </build>
     </profile>
  </profiles>
</project>

或執(zhí)行命令mvn test -Denv=test搂捧。

上面使用 -D 傳遞環(huán)境變量驮俗,其中 env 對應(yīng)剛才設(shè)置的 <name> 值,test 對應(yīng)<value>允跑。

5王凑、maven倉庫

Maven 倉庫能幫助我們管理構(gòu)件(主要是JAR),它就是放置所有JAR文件(WAR聋丝,ZIP索烹,POM等等)的地方。

Maven 倉庫有三種類型:
本地(local)
中央(central)
遠(yuǎn)程(remote)

5.1 本地倉庫

Maven 的本地倉庫弱睦,在安裝 Maven 后并不會創(chuàng)建百姓,它是在第一次執(zhí)行 maven 命令的時候才被創(chuàng)建。
運(yùn)行 Maven 的時候况木,Maven 所需要的任何構(gòu)件都是直接從本地倉庫獲取的垒拢。如果本地倉庫沒有,它會首先嘗試從遠(yuǎn)程倉庫下載構(gòu)件至本地倉庫火惊,然后再使用本地倉庫的構(gòu)件求类。
默認(rèn)情況下,屹耐,每個用戶在自己的用戶目錄下都有一個路徑名為 .m2/respository/ 的倉庫目錄尸疆。
Maven 本地倉庫默認(rèn)被創(chuàng)建在 %USER_HOME% 目錄下。要修改默認(rèn)位置惶岭,在 %M2_HOME%\conf 目錄中的 Maven 的 settings.xml 文件中定義另一個路徑寿弱。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 
   http://maven.apache.org/xsd/settings-1.0.0.xsd">
      <localRepository>C:/MyLocalRepository</localRepository>
</settings>
5.2 中央倉庫

Maven 中央倉庫是由 Maven 社區(qū)提供的倉庫,其中包含了大量常用的庫俗他。

中央倉庫包含了絕大多數(shù)流行的開源Java構(gòu)件脖捻,以及源碼阔逼、作者信息兆衅、SCM、信息嗜浮、許可證信息等羡亩。一般來說,簡單的Java項(xiàng)目依賴的構(gòu)件都可以在這里下載到危融。

5.3 遠(yuǎn)程倉庫

如果 Maven 在中央倉庫中也找不到依賴的文件畏铆,它會停止構(gòu)建過程并輸出錯誤信息到控制臺。為避免這種情況吉殃,Maven 提供了遠(yuǎn)程倉庫的概念辞居,它是開發(fā)人員自己定制倉庫楷怒。舉例如下:

<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.companyname.projectgroup</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>
   <dependencies>
      <dependency>
         <groupId>com.companyname.common-lib</groupId>
         <artifactId>common-lib</artifactId>
         <version>1.0.0</version>
      </dependency>
   <dependencies>
   <repositories>
      <repository>
         <id>companyname.lib1</id>
         <url>http://download.companyname.org/maven2/lib1</url>
      </repository>
      <repository>
         <id>companyname.lib2</id>
         <url>http://download.companyname.org/maven2/lib2</url>
      </repository>
   </repositories>
</project>

PS: maven倉庫默認(rèn)在國外,使用相對較慢瓦灶。我們可以更換為阿里云的倉庫鸠删,具體方式請使用搜索引擎。

5.4 maven依賴搜索倉庫的順序
  1. 在本地倉庫中搜索贼陶,如果找不到刃泡,執(zhí)行步驟 2,如果找到了則執(zhí)行其他操作碉怔。
  2. 在中央倉庫中搜索烘贴,如果找不到,并且有一個或多個遠(yuǎn)程倉庫已經(jīng)設(shè)置撮胧,則執(zhí)行步驟 4桨踪,如果找到了則下載到本地倉庫中以備將來引用。
  3. 如果遠(yuǎn)程倉庫沒有被設(shè)置芹啥,Maven 將簡單的停滯處理并拋出錯誤(無法找.到依賴的文件)馒闷。
  4. 在一個或多個遠(yuǎn)程倉庫中搜索依賴的文件,如果找到則下載到本地倉庫以備將來引用叁征,否則 Maven 將停止處理并拋出錯誤(無法找到依賴的文件)

6纳账、maven插件

未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捺疼,隨后出現(xiàn)的幾起案子疏虫,更是在濱河造成了極大的恐慌,老刑警劉巖啤呼,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卧秘,死亡現(xiàn)場離奇詭異,居然都是意外死亡官扣,警方通過查閱死者的電腦和手機(jī)翅敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惕蹄,“玉大人蚯涮,你說我怎么就攤上這事÷袅辏” “怎么了遭顶?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泪蔫。 經(jīng)常有香客問我棒旗,道長,這世上最難降的妖魔是什么撩荣? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任铣揉,我火速辦了婚禮饶深,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逛拱。我一直安慰自己粥喜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布橘券。 她就那樣靜靜地躺著额湘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旁舰。 梳的紋絲不亂的頭發(fā)上锋华,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音箭窜,去河邊找鬼毯焕。 笑死,一個胖子當(dāng)著我的面吹牛磺樱,可吹牛的內(nèi)容都是我干的纳猫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼竹捉,長吁一口氣:“原來是場噩夢啊……” “哼芜辕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起块差,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤侵续,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后憨闰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體状蜗,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年鹉动,在試婚紗的時候發(fā)現(xiàn)自己被綠了轧坎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泽示,死狀恐怖缸血,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情边琉,我是刑警寧澤属百,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布记劝,位于F島的核電站变姨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厌丑。R本人自食惡果不足惜定欧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一渔呵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砍鸠,春花似錦扩氢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饭弓,卻和暖如春双饥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弟断。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工咏花, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阀趴。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓昏翰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刘急。 傳聞我的和親對象是個殘疾皇子棚菊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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

  • 需求:lib升級管理不方便,轉(zhuǎn)為maven項(xiàng)目叔汁,方便管理窍株。解決方案:maven提倡的是"約定優(yōu)于配置",而目前項(xiàng)目...
    土豆了解一下閱讀 1,540評論 0 0
  • maven 項(xiàng)目骨架生成工具 基本約定 源碼 src/main/java 資源 src/main/resource...
    lxian2shell閱讀 835評論 0 0
  • 最初用maven 的最大好處攻柠,可以自動打包球订,自動構(gòu)建,可以幫我們管理jar包,不用同之前一樣手動去找到j(luò)ar包瑰钮,c...
    A430閱讀 349評論 0 0
  • Maven是基于項(xiàng)目對象模型pom冒滩,通過一小段信息來管理項(xiàng)目的構(gòu)建、報告和文檔的項(xiàng)目軟件管理工具浪谴。 maven目錄...
    icecrea閱讀 345評論 0 0
  • Maven目錄結(jié)構(gòu) http://maven.apache.org/guides/introduction/int...
    黑客不黑撒閱讀 274評論 0 0