Maven簡介,抖音四面被拒,再戰頭條終獲offer

禿頭的一一 2021-09-19 18:09:04 阅读数:636

maven 四面 offer
在聚合多個項目時,如果這些被聚合的項目中需要引入相同的Jar,那麼可以將這些Jar寫入父pom中,各個子項目繼承該pom即可。
繼承的作用,為了簡化pom.xml配置,簡化groupId,artifactId, version ,還可以鎖定子工程依賴版本。
  1. 如何實現繼承?
  • 父pom配置:將需要繼承的Jar包的坐標放入標簽即可。

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0-jre</version>
</dependency>
</dependencies>
</dependencyManagement>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 子pom配置:

<parent>
<groupId>父pom所在項目的groupId</groupId>
<artifactId>父pom所在項目的artifactId</artifactId>
<version>父pom所在項目的版本號</version>
</parent>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

[](

)生命周期

Maven有三套相互獨立的生命周期,請注意這裏說的是“三套”,而且“相互獨立”,初學者容易將Maven的生命周期看成一個整體,其實不然。這三套生命周期分別是:

**① Clean Lifecycle 在進行真正的構建之前進行一些清理工作。 **Clean生命周期一共包含了三個階段:

  • pre-clean 執行一些需要在clean之前完成的工作

  • clean 移除所有上一次構建生成的文件

  • post-clean 執行一些需要在clean之後立刻完成的工作

② Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。

  • validate

  • generate-sources

  • process-sources

  • generate-resources

  • process-resources 複制並處理資源文件,至目標目錄,准備打包

  • compile 編譯項目的源代碼

  • process-classes

  • generate-test-sources

  • process-test-sources

  • generate-test-resources

  • process-test-resources 複制並處理資源文件,至目標測試目錄

  • test-compile 編譯測試源代碼

  • process-test-classes

  • test 使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署

  • prepare-package

  • package 接受編譯好的代碼,打包成可發布的格式,如 JAR

  • pre-integration-test

  • integration-test

  • post-integration-test

  • verify

  • install 將包安裝至本地倉庫,以讓其它項目依賴。

  • deploy 將最終的包複制到遠程的倉庫,以讓其它開發人員與項目共享

總結:不論你要執行生命周期的哪一個階段,maven都是從這個生命周期的開始執行

插件:每個階段都有插件(plugin)。插件的職責就是執行它對應的命令。

③ Site Lifecycle 生成項目報告,站點,發布站點。

  • pre-site 執行一些需要在生成站點文檔之前完成的工作

  • site 生成項目的站點文檔

  • post-site 執行一些需要在生成站點文檔之後完成的工作,並且為部署做准備

  • site-deploy 將生成的站點文檔部署到特定的服務器上

[](

)Maven常用操作


[](

)手動安裝Maven依賴

像Oracle驅動包在Maven中心倉庫是找不到的,需要到Oracle官網下載,然後手動安裝Maven依賴,具體操作可以參考[手動安裝Maven依賴](

)

[](

)部署jar包到遠程倉庫

部署jar包到遠程倉庫主要包括兩個部分:遠程倉庫認證,部署jar包到遠程倉庫

具體操作可以參考[Maven部署jar包到遠程倉庫](

)

[](

)構建多模塊Maven項目

[](

)dependencyManagement

在項目開發過程中,有時一個項目下面包含了幾個子模塊,在多模塊的情况,POM的配置應該要注意寫什麼呢?我們通過一個例子來說明下。

有這樣一個工程,裏面有A模塊、B模塊和C模塊,A模塊需要引入junit和log4j庫,配置如下:


<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
<version>1.2.16</version>
</dependency>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

此時B模塊也需要引入這兩個庫,配置如下:


<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
<version>1.2.17</version>
</dependency>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

會發現A模塊和B模塊對junit和log4j庫依賴的版本是不同的,出現這種情况是十分危險的,因為依賴不同版本的庫可能會造成很多未知的風險。怎麼解决不同模塊之間對同一個庫的依賴版本一樣呢?Maven提供了優雅的解决辦法,使用繼承機制以及dependencyManagement元素來解决這個問題。 如果你在父模塊中配置dependencies,那麼所有的子模塊都自動繼承,不僅達到了依賴一致的目的,還省了大段的代碼,但這樣來做會存在問題的。比如B模塊需要spring-aop模塊,但是C模塊不需要spring-aop模塊,如果用dependencies在父類中統一配置,C模塊中也會包含有spring-aop模塊,不符合我們的要求。但是用dependencyManagement就沒有這樣的問題。dependencyManagement只會影響現有依賴的配置,但不會引入依賴。 這樣我們在父模塊中的配置可以更改為如下所示:


<!-- dependencyManagement只會影響現有依賴的配置,但不會引入依賴。 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</dependencyManagement>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

這段配置不會給任何子模塊引入依賴,如果某個子模塊需要junit和log4j,只需要這樣配置即可:


<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

在多模塊Maven項目中,使用dependencyManagement能够有效地幫我們維護依賴一致性。

[](

)pluginManagement

上面介紹了在多模塊中對依賴庫的管理,接下來介紹下對插件的管理。與dependencyManagement類似,我們可以使用pluginManagement元素管理插件。一個常見的用法就是我們希望項目所有模塊的使用compiler插件的時候,都是用jdk1.8,以及指定Java源文件編碼為UTF-8,這時可以在父模塊的POM中如下配置pluginManagement:


<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

這段配置會被應用到所有子模塊的compiler插件中,因為Maven內置了compiler插件與生命周期的綁定,因此子模塊不需要任何maven-compiler-plugin的配置了。

[](

)Maven常用命令


| 命令 | 說明 |

| — | — |

| mvn clean | 清除原來的編譯結果 |

| mvn compile | 編譯 |

| mvn test | 運行測試代碼,mvn test -Dtest=類名 //單獨運行測試類 |

| mvn package | 打包項目,mvn package -Dmaven.test.skip=true //打包時不執行測試 |

| mvn install | 將項目打包並安裝到本地倉庫 |

| mvn deploy | 發布到本地倉庫或者服務器 |

[](

)Maven常用插件


Maven本質上是一個插件框架,它的核心並不執行任何具體的構建任務,所有這些任務都交給插件來完成。下面說幾個常用的插件:

maven-compiler-plugin(編譯插件)

用來編譯Java代碼,在對Java代碼進行編譯的時候,可以指定使用哪個JDK版本來進行編譯,配置如下所示:


<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<!-- 源代碼使用jdk1.8支持的特性 -->
<source>1.8</source>
<!-- 使用jdk1.8編譯目標代碼 -->
<target>1.8</target>
<!-- 傳遞參數 -->
<compilerArgs>
<arg>-parameters</arg>
<arg>-Xlint:unchecked</arg>
<arg>-Xlint:deprecation </arg>
</compilerArgs>
</configuration>
</plugin>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

maven-resources-plugin(資源插件)

Maven區別對待Java代碼和資源文件,maven-resources-plugin則用來處理資源文件。默認的主資源文件目錄是src/main/resources,很多時候會需要添加額外的資源文件目錄,這個時候就可以通過配置maven-resources-plugin來實現,配置如下所示:


<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<!-- 與Maven編譯生命周期綁定在一起 -->
<phase>compile</phase>
</execution>
</executions>
</plugin>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

maven-surefire-plugin(測試插件)

Maven2/3中用於執行測試的插件不是maven-test-plugin,而是maven-surefire-plugin,其實在大部分情况下,只要你的測試類遵循通用的命令約定(以Test結尾,以TestCase結尾、或者Test開頭),就幾乎不用知曉該插件的存在。但是當你想要跳過測試、排除某些測試類、或者使用一些TestNG特性的時候,就要用到了maven-surefire-plugin的一些配置選項了,配置如下所示:


<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<!-- 跳過測試 -->
<skipTests>true</skipTests>
</configuration>
</plugin>

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

maven-clean-plugin(清除插件)

主要作用就是清理構建目錄下的全部內容,有些項目,構建時需要清理構建目錄以外的文件,比如指定的庫文件,這時候就需要配置來實現了,配置如下所示:


<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<!--<skip>true</skip>-->
<!--<failOnError>false</failOnError>-->
<!--當配置true時,只清理filesets裏的文件,構建目錄中得文件不被清理.默認是flase.-->
<excludeDefaultDirectories>false</excludeDefaultDirectories>
<filesets>
<fileset>
<!--要清理的目錄比特置-->
<directory>${basedir}/logs</directory>
<!--是否跟隨符號鏈接 (symbolic links)-->
# 1200頁Java架構面試專題及答案
小編整理不易,對這份**1200頁Java架構面試專題及答案**感興趣勞煩幫忙**轉發/點贊**
**[CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】](https://ali1024.coding.net/public/P7/Java/git)**
![Maven簡介,抖音四面被拒,再戰頭條終獲offer_後端](https://s5.51cto.com/images/20210919/1632045601129738.jpg)
![Maven簡介,抖音四面被拒,再戰頭條終獲offer_程序員_02](https://s6.51cto.com/images/20210919/1632045602130262.jpg)
# 百度、字節、美團等大廠常見面試題
![Maven簡介,抖音四面被拒,再戰頭條終獲offer_程序員_03](https://s5.51cto.com/images/20210919/1632045602952450.jpg)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
版权声明:本文为[禿頭的一一]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919180903758U.html