一、什么是Maven
Maven項目對象模型(POM),可以通過一小段描述信息來管理項目的構建,報告和文檔的項目管理工具軟件。(摘自百度百科)
只看這個定義好像不能讓我們理解它到底是用來干什么的。回顧一下,以前我們創建項目的時候,需要手動的導入各種各樣的jar依賴,我們會先確定這個項目要用到哪些jar包,具體用哪個版本,然后去網上找到這些jar包,下載后再手動導入到項目中去。如果所需要的jar包較少還好,如果一個項目幾十個jar包那么單單處理這個事情就會非常復雜。
那么這時候如果有個地方能把所有的各個版本的jar包都收集起來,我們用的時候直接根據名稱版本去這個地方拿就行了,這樣就會方便許多。這就是maven所做的事,Maven創建了一個中央倉庫,它里面包含了幾乎所有的各個版本的jar包,我們在使用的時候只需要列一個清單,告訴maven要用到哪些叫什么名字、什么版本的jar包,maven就會自動幫我們下載下來並導入到項目中。
那從maven下載的jar包是直接放到我們的項目中的嗎,答案是否定的。我們還回到之前沒用maven的時候,假如我們第一次創建了一個比如是ssm的項目,那么我們會收集到所需要的相關jar包,那么下次再用的時候就可以直接從這個項目中拿,然后再根據項目的需求,把多余的去掉,不夠的找到添加進來。既然這樣,那不如自己在本地建一個專門存放jar包的文件夾,把自己用過的jar包都放進來,隨着寫的項目越來越多,這個文件夾里的jar包也會越來越多,可能以后再建項目的時候直接來這個文件夾中找就夠了,也不用從網上找了。
其實以上過程maven也幫我們做了,從maven中央倉庫中下載過來的jar包會幫我們放到本地倉庫中,這樣我們使用jar包時,maven會先找我們的本地倉庫,有的話直接導入,沒有就先下到本地倉庫,然后再導入到項目中。
當然,maven的優點並不只在於方便導入jar包,開頭就說了它是一個項目管理工具,它的目標是簡化構建過程、提供統一的構建系統、提供優質的項目信息、提供最佳實踐開發指南,這里只說下jar包相關,其它就不展開講了,有興趣可以去maven官網看看,里面有詳細的說明。
下面就來看看如何使用maven構建項目吧!
二、下載maven
官網下載地址http://maven.apache.org/download.cgi
點擊apache-maven-3.6.3-bin.zip下載。注意,如果你在后面使用idea配置完maven后,出現一些無法解決的問題時,可以嘗試降一下maven的版本,不使用最新版的maven
下載完成后解壓的到任意文件夾,這里我解壓到了C:\Program Files目錄下,記住你的目錄,無需安裝,接下來配置環境變量。
右鍵此電腦-->屬性-->高級系統設置-->環境變量
點擊新建,變量名為MAVEN_HOME,變量值為maven的解壓目錄
雙擊Path,點擊新建,輸入%MAVEN_HOME%\bin,點擊確定
打開cmd命令窗口,輸入mvn -v,顯示版本信息則說明環境變量配置成功
三、修改maven配置文件
打開maven目錄中conf目錄下的settings文件。
之前說過,maven會將從中央倉庫下載的jar包放到本地倉庫中,而這個本地倉庫其實就是maven幫我們建立的一個文件夾,目錄為C:\Users\你的用戶名\.m2\repository,這個路徑是可以修改的。當然,你也可以選擇不修改。
打開settings文件后找到<localRepository>標簽,默認是放在c盤用戶目錄下的,隨着項目的增多,這個文件夾會越來越大,如果不想讓它占用c盤的話,可以把這個目錄改成其他盤。這里我在maven目錄下新建了個repo的文件夾,用作本地倉庫的路徑。
我們知道maven是從中央倉庫下載jar包的,但是這個中央倉庫的服務器是在國外的,下載會非常慢,好在阿里雲做了一個國內的鏡像倉庫,所以我們還要把倉庫的地址修改為阿里雲的地址。
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里雲公共倉庫</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
找到<mirros>標簽,將上面的內容復制到里面即可。
接下來修改maven項目的默認jdk版本,找到<profiles>標簽,將以下內容復制到里面即可。
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
四、在idea中配置maven
當然,我們一般使用maven都是在ide中使用的,其實idea已經默認自帶的有maven,但是當然沒有我們自己配置的用着好用。打開設置,找到構建、執行、部署——>構建工具——>Maven(英文界面下為Build, Execution, Deployment——>Build Tools——>Maven,想使用中文界面的可以去插件里面下載中文插件),如下圖。默認的是idea自帶的maven,點擊主目錄的箭頭,會自動識別到我們安裝的maven,選中后記得點擊下面的用戶設置文件和本地儲存庫右面的覆蓋,將配置文件和目錄修改為我們自己設置的。
五、使用idea新建一個Maven項目
點擊新建項目,選擇maven,選中從原型創建,選擇maven的web項目模板
填寫項目名稱,選擇項目目錄,至於下面的構建坐標是什么意思,idea已經給出了提示,待會看pom文件的時候再解釋
這里注意這些maven的設置,剛才我們已經在設置里面將默認的maven替換成了我們自己的,那這里應該已經是我們的maven選項,如果還是默認的,就手動修改一下。點擊finish完成項目創建。
注意控制台的提示信息,看到是用阿里雲的maven倉庫下載說明我們的配置文件生效了,第一次創建會下載一些東西,如果半天還沒構建完成那就要看是不是從國外的倉庫下載的
看的下面信息說明項目構建成功,因為我這里不是第一次創建,所需要的東西已經下載好了,所以只用了5秒多
下面一起來看一下maven的項目結構,可以發現main文件夾下只有webapp文件夾,我們還需要自己建幾個文件夾,來存放java文件和配置文件,不過直接在main底下右鍵新建是不生效的,還需要標記一下
按住ctrl+alt+shift+s或點擊文件——>項目結構,選擇模塊,在main文件夾下建立java,resources,test三個文件夾
選中java文件夾,點擊上方的標記為,源(也可以右鍵選擇),表示該文件夾為存放java文件的文件夾,另外兩個文件夾同理,標記完后右側會出現提示,點擊確定
此時可以看到我們的文件夾已經變了顏色,除了上面這種方式,也可以直接在main下新建文件夾,右鍵標記。
六、maven的項目結構及pom文件
項目目錄說明如下圖,可以看到好像和我們普通的web項目沒有很大的區別,但是看着更加規范了,是的,maven的思想就是約定大於配置,它規定了項目的文件目錄結構(不僅限於此),我們要使用它就必須遵守它的規定,一般情況下,它的默認規定會使我們的開發更加高效,springboot也是基於這種思想。
具體的項目目錄規定見下圖,更多內容請訪問官網查看
上面我們已經搭好了一個基本的項目,那么接下來就看看maven項目的核心——pom.xml,開頭說的很方便的導入jar包也是在這里配置的。以下內容參考官網的pom文件介紹,地址https://maven.apache.org/pom.html#What_is_the_POM,當然,我們起步階段只需要了解其中一部分常用配置就行了。
<?xml version="1.0" encoding="UTF-8"?>
<!--maven約束-->
<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>
<!-- 本項目坐標,即創建項目的時填寫的內容 -->
<!-- 公司或組織名稱,一般是域名反寫,如com.alibaba,org.springframework等 -->
<groupId>org.example</groupId>
<!-- 項目名稱(id)。一個公司或組織下可以有多個項目,如org.springframework下有spring-core,spring-beans等 -->
<artifactId>mavenproject</artifactId>
<!-- 項目版本 -->
<version>1.0-SNAPSHOT</version>
<!-- 項目的打包方式,jar包或war包等 -->
<packaging>war</packaging>
<!-- 項目名稱 -->
<name>mavenproject Maven Webapp</name>
<!-- 項目地址 -->
<url>http://www.example.com</url>
<!-- 定義屬性,可以在其他地方通過${標簽名}引用 -->
<properties>
<!-- 項目編碼 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 項目的jdk版本,這里默認的是1.7,可以手動改為你自己的jdk版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 以下是自定義的標簽 -->
<!-- 例如我們下面要使用spring的一些依賴,為了便於管理spring的版本,可以在這里聲明
然后在version標簽里通過${spring.version}引用 -->
<spring.version>5.1.10.RELEASE</spring.version>
</properties>
<!-- 項目的依賴關系,導入jar包就是在這里導入 -->
<dependencies>
<!-- <dependencies>標簽下可以有多個<dependency>標簽,每一個都對應一個我們要引用的jar包 -->
<!-- 通過groupId,artifactId可以精確找到一個項目,通過version確定版本,下面以fastjson為例 -->
<dependency>
<!-- 組id為阿里巴巴公司的域名反寫(大部分都是這樣,但也有例外,如下方的junit,就只有junit一個單詞) -->
<groupId>com.alibaba</groupId>
<!-- 項目名,fastjson -->
<artifactId>fastjson</artifactId>
<!-- 我們要使用的版本 -->
<version>1.1.23</version>
<!-- 作用域,不寫默認為compile,說明無論編譯、運行、測試、打包都會被包含進去。
如下面的junit,作用域為test,就只會在測試的時候被需要,其他還有provided、runtime、system
詳情請參考—— https://www.cnblogs.com/kingsonfu/p/10342892.html -->
<scope>compile</scope>
</dependency>
<!-- 我們在<properties>標簽里聲明了spring的版本,那么在<version>里就可以直接引用,以后直接修改spring.version即可 -->
<!-- spring-webmvc相關依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring事務依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 構建項目需要的信息 -->
<build>
<finalName>mavenproject</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
以上簡單介紹了pom文件的使用,我們剛開始使用會使用它導包就行了,以后項目復雜之后會進行更多的配置。那現在我們已經知道了使用maven導包只需要添加一個<dependency>標簽,然后填寫<groupId>、<artifactId>、<version>的內容就好了,接下來說說如何搜索maven的項目坐標,畢竟我們也不可能把那么多坐標全背下來。
訪問maven的倉庫官網https://mvnrepository.com/,在搜索框里輸入想要使用的jar包關鍵詞即可,這里以spring為例,假如我們要使用spring context,點擊它
選擇需要的版本,注意右側Usages,數字越大說明被使用的越多,盡量選擇使用廣泛的版本。這里只是演示,就點最新版本了
點進來就能看到maven的坐標了,將它復制到<dependencies>標簽里就導進來了,不過這時候是紅色的,正常情況下idea默認的是pom文件發生變化自動更新,如果沒有自動下載,可以使用快捷鍵ctrl+shift+o刷新,下載完成后就會變成正常的黑色,打開左側的External Libraries會發現已經下載並導入成功
有時候如果官網進不去的,我們也可以使用阿里雲的maven倉庫搜索,都是一樣的
下載后的jar包是在External Libraries目錄下的,可以在這里找到源碼,而不是像普通項目那樣直接放在了WEB-INF的lib目錄下,它是運行的時候才會被打包到lib目錄下的