1. 程式人生 > 其它 >要面試了?Maven相關知識都給你整理好了

要面試了?Maven相關知識都給你整理好了

點選關注強哥,檢視更多精彩文章呀

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

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

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

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

Maven裡的modelVersion是什麼?

modelVersion 描述這個POM檔案是遵從哪個版本的專案描述符。專案描述符其實就是XML檔案需要遵循的XSD規則。

<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:指定了當前POM模型的版本,模型本身的版本很少改變,雖然如此,但它仍然是必不可少的,這是為了當Maven引入了新的特性或者其他模型變更的時候,確保穩定性。對於Maven 2及Maven 3來說,它只能是4.0.0。

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

父(Super)POM是 Maven 預設的 POM(類似Java的Object類是其他類的公共父類)。所有的 POM 都繼承自一個父 POM(無論是否顯式定義了這個父 POM)。父 POM 包含了一些可以被繼承的預設設定。因此,當 Maven 發現需要下載 POM 中的 依賴時,它會到 Super POM 中配置的預設倉庫

http://repo1.maven.org/maven2 去下載。

使用以下命令來檢視 Super POM 預設配置:

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

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

我們知道,程式碼版本管理工具都有自己獨特的命令來操作提交變更、或從伺服器上獲取最新的原始碼,如SVN及CVS的操作就很不相同,使用Maven擔任的SCM機制,就可以使得SCM的操作變得統一

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>
        <!--給開發者使用的,類似connection元素。即該連線不僅僅只讀 -->
        <developerConnection>
            scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
        </developerConnection>
        <!--當前程式碼的標籤,在開發階段預設為HEAD -->
        <tag />
        <!--指向專案的可瀏覽SCM庫(例如ViewVC或者Fisheye)的URL。 -->
        <url>http://svn.baidu.com/banseon</url>
    </scm>

對應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的作用

繼承自該專案的所有子專案的預設依賴資訊。這部分的依賴資訊不會被立即解析,而是當子專案宣告一個依賴(必須描述group ID和 artifact ID資訊),如果group ID和artifact ID以外的一些資訊沒有描述,則通過group ID和artifact ID 匹配到這裡的依賴,並使用這裡的依賴資訊。

使用dependencyManagement可以統一管理專案的版本號,確保應用的各個專案的依賴和版本一致,不用每個模組專案都弄一個版本號,不利於管理,當需要變更版本號的時候只需要在父類容器裡更新,不需要任何一個子專案的修改;如果某個子專案需要另外一個特殊的版本號時,只需要在自己的模組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區別
  • Dependencies相對於dependencyManagement,所有生命在dependencies裡的依賴都會自動引入,並預設被所有的子專案繼承。

  • dependencyManagement裡只是宣告依賴,並不自動實現引入,因此子專案需要顯示的宣告需要用的依賴。如果不在子專案中宣告依賴,是不會從父專案中繼承下來的;只有在子專案中寫了該依賴項,並且沒有指定具體版本,才會從父專案中繼承該項,並且version和scope都讀取自父pom;另外如果子專案中指定了版本號,那麼會使用子專案中指定的jar版本。

Maven構建配置檔案的型別和啟用方式有哪些?

構建配置檔案大體上有三種類型:

型別 在哪定義
專案級(Per Project) 定義在專案的POM檔案pom.xml中
使用者級 (Per User) 定義在Maven的設定xml檔案中 (%USER_HOME%/.m2/settings.xml)
全域性(Global) 定義在 Maven 全域性的設定 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 為構建配置檔案指定的 id 引數,這個引數通過 -P 來傳輸,當然,它可以是 prod 或者 normal 這些由你定義的id

  • 通過 maven 設定。
<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>
  • 基於環境變數(使用者或者系統變數)。
    這個需要在 pom.xml 裡面的 id 為 test 的 profile 節點,加入 activation 節點:
<profiles>
      <profile>
          <id>test</id>
          <activation>
            <property>
               <name>env</name>
               <value>test</value>
            </property>
          </activation>
          ……
      </profile>
</profiles>

然後執行命令:

mvn test -Denv=test
  • 作業系統設定(比如說,Windows系列)。
    activation 元素包含下面的作業系統資訊。當系統為 windows XP 時,test Profile 將會被觸發。
<profile>
   <id>test</id>
   <activation>
      <os>
         <name>Windows XP</name>
         <family>Windows</family>
         <arch>x86</arch>
         <version>5.1.2600</version>
      </os>
   </activation>
</profile>

然後執行命令:

mvn test
  • 檔案的存在或者缺失。
    現在使用 activation 元素包含下面的作業系統資訊。當 target/generated-sources/axistools/wsdl2java/com/companyname/group 缺失時,test Profile 將會被觸發。
<profile>
   <id>test</id>
   <activation>
      <file>
         <missing>target/generated-sources/axistools/wsdl2java/
         com/companyname/group</missing>
      </file>
   </activation>
</profile>

然後執行命令:

mvn test
聊聊你對Maven外掛的理解

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

  • clean:專案清理的處理
  • default(或 build):專案部署的處理
  • site:專案站點文件建立的處理
    每個生命週期中都包含著一系列的階段(phase)。這些 phase 就相當於 Maven 提供的統一的介面,然後這些 phase 的實現由 Maven 的外掛來完成。

我們在輸入 mvn 命令的時候 比如 mvn clean,clean 對應的就是 Clean 生命週期中的 clean 階段。但是 clean 的具體操作是由 maven-clean-plugin 來實現的。

所以說 Maven 生命週期的每一個階段的具體實現都是由 Maven 外掛實現的。

外掛通常提供了一個目標的集合,並且可以使用下面的語法執行:

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

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

mvn compiler:compile
如何自定義Maven外掛

我們經常在寫pom的時候,會在build的幾點裡面配有各式各樣的plugin,這些plugin就是maven的外掛,他們通常叫做Mojo,這些外掛的作用就是在構建專案的過程中,執行一些動作,行為,例如使用maven-jar-plugin的外掛,就是用於打包jar。又例如,我們在使用spring boot的時候,為什麼執行mvn spring-boot:run的時候,maven會做一些spring-boot的構建方式,是因為我們在build裡面配有了spring-boot-maven-plugin的外掛,並且執行了run的類。

自定義外掛步驟:

1、建立一個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、寫外掛實現java執行類,需要繼承AbstractMojo類,和重寫execute方法,裡面就是具體我們要實行的的邏輯,新增關鍵註解

// mojo註解就是maven外掛的註解。name就是後面使用該外掛的時候excuation裡面的,
// 後面配置的是生命週期,即預設是安裝時候執行本外掛(這個可以在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、 把這個外掛,安裝到庫裡面,執行 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對應的就是上面我們自定義元件中@Mojo裡面的name屬性:

mvn my:hello
Maven快照和版本的區別

快照是一種特殊的版本,指定了某個當前的開發進度的副本。不同於常規的版本,Maven 每次構建都會在遠端倉庫中檢查新的快照。 現在 data-service 團隊會每次釋出更新程式碼的快照到倉庫中,比如說 data-service:1.0-SNAPSHOT 來替代舊的快照 jar 包。

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

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

寫在最後

好啦,以上就是強哥為大家整理的Maven相關的知識點,當然有一些非常基礎我們平常都在用的強哥就沒列進去了。即使不是用於面試,這個文件還是很值得收藏的。之後還會總結一些其他面試的相關資料,大家敬請期待哈~

點選關注強哥,檢視更多精彩文章呀