要面試了?Maven相關(guān)知識都給你整理好了

點擊關(guān)注強哥,查看更多精彩文章呀

哈嘍,大家好,我是強哥。

現(xiàn)在正值金三銀四的好時節(jié),面試前的準備必然不能少,畢竟一次好的面試準備對于是否能找到好的OFFER和提高自己的薪資有很大的幫助。

強哥最近也開始整理一些面試資料給大家,都是良心收集,童叟無欺,干貨滿滿。

今天送上的是Maven專題。Let's Go!!!

Maven里的modelVersion是什么?

modelVersion 描述這個POM文件是遵從哪個版本的項目描述符。項目描述符其實就是XML文件需要遵循的XSD規(guī)則。

<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>
</project>

modelVersion:指定了當(dāng)前POM模型的版本,模型本身的版本很少改變,雖然如此,但它仍然是必不可少的,這是為了當(dāng)Maven引入了新的特性或者其他模型變更的時候,確保穩(wěn)定性。對于Maven 2及Maven 3來說,它只能是4.0.0。

父(Super)POM的概念是什么?

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

使用以下命令來查看 Super POM 默認配置:

mvn help:effective-pom
scm配置的作用

軟件配置管理的(SCM:Software Configuration Management)它可以支持我們常用SVN、CVS、GIT等。

我們知道,代碼版本管理工具都有自己獨特的命令來操作提交變更、或從服務(wù)器上獲取最新的源碼,如SVN及CVS的操作就很不相同,使用Maven擔(dān)任的SCM機制,就可以使得SCM的操作變得統(tǒng)一

scm配置:

 <!--SCM(Source Control Management)標簽允許你配置你的代碼庫,供Maven web站點和其它插件使用。 -->
    <scm>
        <!--SCM的URL,該URL描述了版本庫和如何連接到版本庫。欲知詳情,請看SCMs提供的URL格式和列表。該連接只讀。 -->
        <connection>
            scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
        </connection>
        <!--給開發(fā)者使用的,類似connection元素。即該連接不僅僅只讀 -->
        <developerConnection>
            scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
        </developerConnection>
        <!--當(dāng)前代碼的標簽,在開發(fā)階段默認為HEAD -->
        <tag />
        <!--指向項目的可瀏覽SCM庫(例如ViewVC或者Fisheye)的URL。 -->
        <url>http://svn.baidu.com/banseon</url>
    </scm>

對應(yīng)maven plugin配置:

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-scm-plugin</artifactId>
    <version>1.8.1</version>
    <configuration>
      <connectionType>developerConnection</connectionType>
    </configuration>
  </plugin> 
</plugins>

常用命令:

  • 提交
mvn -Dmessage="<commit_log_here>" scm:checkin
  • 更新
mvn scm:update
dependencyManagement的作用

繼承自該項目的所有子項目的默認依賴信息。這部分的依賴信息不會被立即解析,而是當(dāng)子項目聲明一個依賴(必須描述group ID和 artifact ID信息),如果group ID和artifact ID以外的一些信息沒有描述,則通過group ID和artifact ID 匹配到這里的依賴,并使用這里的依賴信息。

使用dependencyManagement可以統(tǒng)一管理項目的版本號,確保應(yīng)用的各個項目的依賴和版本一致,不用每個模塊項目都弄一個版本號,不利于管理,當(dāng)需要變更版本號的時候只需要在父類容器里更新,不需要任何一個子項目的修改;如果某個子項目需要另外一個特殊的版本號時,只需要在自己的模塊dependencies中聲明一個版本號即可。子類就會使用子類聲明的版本號,不繼承于父類版本號。

在父模塊中:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.44</version>
            </dependency>
        </dependencies>
</dependencyManagement>

那么在子模塊中只需要groupIdartifactId即可,如:

 <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
 </dependencies>
dependencyManagement與dependencies區(qū)別
  • Dependencies相對于dependencyManagement,所有生命在dependencies里的依賴都會自動引入,并默認被所有的子項目繼承。

  • dependencyManagement里只是聲明依賴,并不自動實現(xiàn)引入,因此子項目需要顯示的聲明需要用的依賴。如果不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,并且沒有指定具體版本,才會從父項目中繼承該項,并且version和scope都讀取自父pom;另外如果子項目中指定了版本號,那么會使用子項目中指定的jar版本。

Maven構(gòu)建配置文件的類型和激活方式有哪些?

構(gòu)建配置文件大體上有三種類型:

類型 在哪定義
項目級(Per Project) 定義在項目的POM文件pom.xml中
用戶級 (Per User) 定義在Maven的設(shè)置xml文件中 (%USER_HOME%/.m2/settings.xml)
全局(Global) 定義在 Maven 全局的設(shè)置 xml 文件中 (%M2_HOME%/conf/settings.xml)

有配置文件如下:

<profiles>
      <profile>
          <id>test</id>
          ……
      </profile>
      <profile>
          <id>prod</id>
          ……
      </profile>
</profiles>

配置文件激活方式:

  • 使用命令控制臺輸入顯式激活。
mvn test -Ptest

第一個 test 為 Maven 生命周期階段,第 2 個 test 為構(gòu)建配置文件指定的 id 參數(shù),這個參數(shù)通過 -P 來傳輸,當(dāng)然,它可以是 prod 或者 normal 這些由你定義的id。

  • 通過 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>
  • 基于環(huán)境變量(用戶或者系統(tǒng)變量)。
    這個需要在 pom.xml 里面的 id 為 test 的 profile 節(jié)點,加入 activation 節(jié)點:
<profiles>
      <profile>
          <id>test</id>
          <activation>
            <property>
               <name>env</name>
               <value>test</value>
            </property>
          </activation>
          ……
      </profile>
</profiles>

然后執(zhí)行命令:

mvn test -Denv=test
  • 操作系統(tǒng)設(shè)置(比如說,Windows系列)。
    activation 元素包含下面的操作系統(tǒng)信息。當(dāng)系統(tǒng)為 windows XP 時,test Profile 將會被觸發(fā)。
<profile>
   <id>test</id>
   <activation>
      <os>
         <name>Windows XP</name>
         <family>Windows</family>
         <arch>x86</arch>
         <version>5.1.2600</version>
      </os>
   </activation>
</profile>

然后執(zhí)行命令:

mvn test
  • 文件的存在或者缺失。
    現(xiàn)在使用 activation 元素包含下面的操作系統(tǒng)信息。當(dāng) target/generated-sources/axistools/wsdl2java/com/companyname/group 缺失時,test Profile 將會被觸發(fā)。
<profile>
   <id>test</id>
   <activation>
      <file>
         <missing>target/generated-sources/axistools/wsdl2java/
         com/companyname/group</missing>
      </file>
   </activation>
</profile>

然后執(zhí)行命令:

mvn test
聊聊你對Maven插件的理解

Maven 有以下三個標準的生命周期:

  • clean:項目清理的處理
  • default(或 build):項目部署的處理
  • site:項目站點文檔創(chuàng)建的處理
    每個生命周期中都包含著一系列的階段(phase)。這些 phase 就相當(dāng)于 Maven 提供的統(tǒng)一的接口,然后這些 phase 的實現(xiàn)由 Maven 的插件來完成。

我們在輸入 mvn 命令的時候 比如 mvn clean,clean 對應(yīng)的就是 Clean 生命周期中的 clean 階段。但是 clean 的具體操作是由 maven-clean-plugin 來實現(xiàn)的。

所以說 Maven 生命周期的每一個階段的具體實現(xiàn)都是由 Maven 插件實現(xiàn)的。

插件通常提供了一個目標的集合,并且可以使用下面的語法執(zhí)行:

mvn [plugin-name]:[goal-name]

例如,一個 Java 工程可以使用 maven-compiler-plugin 的 compile-goal 編譯,使用以下命令:

mvn compiler:compile
如何自定義Maven插件

我們經(jīng)常在寫pom的時候,會在build的幾點里面配有各式各樣的plugin,這些plugin就是maven的插件,他們通常叫做Mojo,這些插件的作用就是在構(gòu)建項目的過程中,執(zhí)行一些動作,行為,例如使用maven-jar-plugin的插件,就是用于打包jar。又例如,我們在使用spring boot的時候,為什么執(zhí)行mvn spring-boot:run的時候,maven會做一些spring-boot的構(gòu)建方式,是因為我們在build里面配有了spring-boot-maven-plugin的插件,并且執(zhí)行了run的類。

自定義插件步驟:

1、創(chuàng)建一個maven項目,引入兩個插件,一個是maven-plugin-api,一個是maven-plugin-annotations,用上這兩個插件,我們才能編寫屬于我們的自定義插件

<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.test.maven</groupId>
  <artifactId>my-maven-plugin</artifactId>
  <packaging>maven-plugin</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>my-maven-plugin Maven Mojo</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>2.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven.plugin-tools</groupId>
      <artifactId>maven-plugin-annotations</artifactId>
      <version>3.1</version>
    </dependency>
  </dependencies>
</project>

2、寫插件實現(xiàn)java執(zhí)行類,需要繼承AbstractMojo類,和重寫execute方法,里面就是具體我們要實行的的邏輯,添加關(guān)鍵注解

// mojo注解就是maven插件的注解。name就是后面使用該插件的時候excuation里面的,
// 后面配置的是生命周期,即默認是安裝時候執(zhí)行本插件(這個可以在pom文件指定)
@Mojo(name="hello",defaultPhase = LifecyclePhase.CLEAN)
public class MyMojo extends AbstractMojo
{
     // 配置的是本maven插件的配置,在pom使用configration標簽進行配置 property就是名字,
    @Parameter
    private String test;

    public void execute() throws MojoExecutionException {
       System.out.println(" ---------->> Hello My Plugins = " + test);
    }
}

3、 把這個插件,安裝到庫里面,執(zhí)行 mvn install。其他項目的pom,在其他項目引用這個插件就像平常一樣,在build里面寫上插件的信息。

<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.test.maven.phase</groupId>
  <artifactId>my-maven-test-phase</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <build>
      <plugins>
      <plugin>
        <groupId>com.test.maven</groupId>
        <artifactId>my-maven-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <configuration>
            <test>peter</test>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

4、運行

這里的hello對應(yīng)的就是上面我們自定義組件中@Mojo里面的name屬性:

mvn my:hello
Maven快照和版本的區(qū)別

快照是一種特殊的版本,指定了某個當(dāng)前的開發(fā)進度的副本。不同于常規(guī)的版本,Maven 每次構(gòu)建都會在遠程倉庫中檢查新的快照。 現(xiàn)在 data-service 團隊會每次發(fā)布更新代碼的快照到倉庫中,比如說 data-service:1.0-SNAPSHOT 來替代舊的快照 jar 包。

對于版本,如果 Maven 以前下載過指定的版本文件,比如說 data-service:1.0,Maven 將不會再從倉庫下載新的可用的 1.0 文件。若要下載更新的代碼,data-service 的版本需要升到1.1。

快照的情況下,每次 app-ui 團隊構(gòu)建他們的項目時,Maven 將自動獲取最新的快照(data-service:1.0-SNAPSHOT)。

寫在最后

好啦,以上就是強哥為大家整理的Maven相關(guān)的知識點,當(dāng)然有一些非?;A(chǔ)我們平常都在用的強哥就沒列進去了。即使不是用于面試,這個文檔還是很值得收藏的。之后還會總結(jié)一些其他面試的相關(guān)資料,大家敬請期待哈~

點擊關(guān)注強哥,查看更多精彩文章呀

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注釋 參考 0 前言 什么是...
    阿父閱讀 12,768評論 1 36
  • 這里記錄 maven 的基礎(chǔ)知識,一方面鞏固自己學(xué)到的知識,另一方面希望可以對有同樣困惑的小伙伴提供一些幫助。 一...
    惜鳥閱讀 929評論 0 5
  • 一. 簡介 Maven 是 Apache 組織下的一個跨平臺的項目管理工具,它主要用來幫助實現(xiàn)項目的構(gòu)建、測試、打...
    wind_sky閱讀 701評論 0 0
  • 本文初衷 Maven 整理自己腦袋中、收藏中的那些資料,來一次清空,讓自己重新開始。 整理這篇的起點是本人已經(jīng)會使...
    UPUPMO閱讀 6,225評論 8 198
  • 1 Maven 介紹 Maven 翻譯為"專家"、"內(nèi)行"它是 Apache 下的一個純 Java 開發(fā)的開源項目...
    Tian_Peng閱讀 863評論 0 0

友情鏈接更多精彩內(nèi)容