哈嘍,大家好,我是強哥。
現(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>
那么在子模塊中只需要groupId和artifactId即可,如:
<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)資料,大家敬請期待哈~