目錄html
首發日期:2018-11-04java
以一個例子說一下maven的好處,說了它的好處,web
1.maven能夠幫咱們管理依賴。在以往的時候,咱們都是手動的導入jar包,而後build path;在導入jar包以前,咱們須要去查找有哪些包,須要哪些包,這是一個很是繁雜的問題,若是你不是「老司機」的話,你可能會遺漏某些jar包;而在maven中,咱們可使用pom.xml來聲明須要哪些依賴包,而後maven就會根據pom.xml中的信息去獲取倉庫中的依賴包的引用,這就至關於導入了jar包。並且,maven存儲了大量的jar包和大量的依賴規則,因此你能夠直接去百度搜索一下某個關鍵字+maven
,就能夠查找到某個框架或工具的依賴信息,直接把這個依賴信息拷貝到pom.xml中,maven就會幫你管理這個依賴。spring
2.maven能夠幫咱們進行工程管理。在以往的時候,咱們開發一個項目都是在一個工程中開發,但事實上這對多人開發並不友好,多個開發者之間的開發產生了耦合關係,這對整合形成了一些小困擾(但並非說很差,只是說有更好的手段)。而使用maven以後,能夠創建多個工程來組成一個項目,在不一樣的工程中開發不一樣的模塊,而多個工程之間的關係由maven管理,maven能夠幫咱們把多個工程組合成一個項目。數據庫
點擊連接,下載Maven:
apache
下載完了以後,直接解壓便可,它是免安裝的。windows
JAVA_HOME
環境變量,值是jdk程序根目錄【若是已經配置過的,能夠省略】
%JAVA_HOME%\bin
添加到path環境變量中【若是已經配置過的,能夠省略】【注意不要弄亂了path的值】MAVEN_HOME
環境變量,值是maven程序根目錄
%MAVEN_HOME%\bin
添加到path環境變量中【注意不要弄亂了path的值】配置了環境變量後,能夠在CMD中鍵入mvn -v
來測試是否能夠運行,下面是個人輸出結果:api
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00) Maven home: J:\software\apache-maven-3.5.4\bin\.. Java version: 1.8.0_91, vendor: Oracle Corporation, runtime: E:\SOFTWARD\Java\jdk1.8.0_91\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
在學會maven以前,先了解幾個概念。下面的概念瞭解便可,後面會在實際的配置中涉及。tomcat
在以往的build path過程當中,其實只是把jar包的路徑引用添加到eclipse中,eclipse知道須要的包的路徑以後,在編譯的時候會去引用。服務器
而maven能夠根據座標來指定使用哪一個依賴包,座標通過必定的組合規則就能夠得出依賴包所在的路徑,maven會根據座標對應的路徑在倉庫中來查找jar包。
maven用三個向量來組成一個座標,這個座標肯定惟一的依賴包:
maven會根據座標在倉庫中來查找jar包,把三個向量拼接起來就是依賴包的路徑。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.0.RELEASE</version> </dependency> <!--對應的路徑轉換格式:groupid/artifactid/artifactid+version+.jar --> <!--org/springframework/spring-core/spring-core4.3.0.RELEASE .jar-->
在上面提到了座標,你應該認識到了座標標識了依賴包的路徑,而這個路徑是相對於倉庫的路徑的。爲何須要一個倉庫呢?上面說了eclipse實質上也是經過路徑來導入依賴包的,若是你沒有一個統一的文件夾來管理依賴包的話,零散的依賴包足以讓你頭疼了。而maven的倉庫是一個包含了衆多依賴包的倉庫,並且maven的依賴管理能夠很方便地添加依賴包信息。
下面以建立一個maven項目,並使用maven的依賴管理來給項目添加依賴爲例:
關於如何建立一個maven項目,下面以eclipse中的爲例,若是你須要idea的,能夠點擊下面的連接學習。
圖解在IntelliJ IDEA中建立第一個Maven項目
新建工程->選擇maven project
在pom.xml中添加下列代碼:
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies>
能夠看得出來,依賴已經導入了咱們項目的類庫。
因此咱們利用依賴包中的類來編寫代碼的時候就不會報錯了。
maven要依據必定的目錄規範來管理項目,因此要想用maven管理項目,要遵循規範。下面會講一下目錄定義規範,這樣是面向全手動建立maven項目的時候,在不少時候,都會使用工具來建立,好比eclipse中就能夠直接建立一個maven工程,這個工程遵循maven工程的目錄規範。
maven構建一個工程要遵循這個目錄規範。
依賴信息中的scope標籤是用來定義依賴範圍的。依賴範圍影響依賴的生存週期(就比如遊戲中的特殊狀態,可能一些狀態可用於pk,一些狀態可用於打副本,一些狀態可用於任務,不一樣的地方影響效果是否生效。),依賴範圍的值有如下幾個:
要注意,在一個工程中,若是導入的依賴須要一系列依賴(A包須要B包才能正常,那麼也會導入B包),那麼也會導入這一些依賴,例如struts2-core依賴一系列的包。
演示:基於eclipse
僅僅導入struts2-core的時候,maven會自動導入struts2-core所依賴的包:
發現maven自動導入了struts2-core依賴的包(這些依賴包是由struts2-core項目中的pom.xml指定的)
可能會遇到一種狀況,在同一個工程中,A包依賴B包的1.0版本,C包依賴B包的1.5版本。那麼B的1.0和1.5都被引入了。這可能會致使紊亂,由於構建的時候會不清楚使用哪一個版本的B依賴包。這時候咱們須要使用依賴排除來解決這個問題。【通常都是排除低版本】
例如struts2-core依賴javassist包,hibernate-core也依賴javassist包,根據依賴的依賴的導入規則,這時候會有兩個javassist
爲了不紊亂,咱們要使用exclusions排除。在eclipse中,咱們能夠在Dependency Hierarchy中右鍵選中包進行排除,也可使用如下xml式排除:
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.34</version> <exclusions> <!-- 排除struts2-core的依賴中的javassist依賴 --> <exclusion> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency>
在創建多個有繼承關係的工程時,父工程的依賴信息會傳遞給子工程。
在父工程中聲明瞭依賴後,就算子工程沒有聲明,也會傳遞到子工程中
在分模塊開發時,多個子模塊可能會使用上同一個依賴包,那麼如何限定多個子模塊都使用同一版本的依賴包呢?可使用版本鎖定。
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
你應該常常見到某個框架的依賴包都是同一版本的,若是咱們將這些依賴信息都添加到pom.xml中,可能會出現多個重複的version標籤,若是你要修改的話是很麻煩的,要逐個逐個去修改版本。
事實上,是能夠統一管理依賴版本的,同一管理依賴版本以後,若是咱們要修改這個框架下的包的版本,那麼只須要修改一處就好了。
<properties> <!-- 使用自定義標籤統一版本號,標籤名是自定義的 --> <struts2-version>2.3.34</struts2-version> </properties> <dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <!--在version標籤中引用 --> <version>${struts2-version}</version> </dependency> </dependencies>
注意:properties標籤並非只能用於統一聲明依賴版本,但凡是須要統一聲明的地方均可以考慮使用properties標籤。
如下命令針對於maven工程,必須到pom.xml目錄才能執行命令
每個階段都有一個對應的命令,且有相應的插件來支持命令的運行。
maven安裝路徑下\conf\settings.xml文件,在settings.xml中配置localResposity標籤。,它是被註釋了的,有配置方法的提示。
默認目錄:用戶目錄下.m2/repository
<mirrors> <!-- 中央倉庫1 --> <mirror> <id>repo1</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo1.maven.org/maven2/</url> </mirror> <!-- 中央倉庫2 --> <mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror> </mirrors>
eclipse有自帶的maven插件,但不建議使用。
把獨立的maven添加成一個新的maven:
配置user settings:
【maven model用於分模塊開發時建立子工程,多個子工程與核心工程組成一個完整的項目。】
新建工程->選擇maven project
下面給的是打包方式爲war的時候的目錄結構:
默認狀況下,maven工程引用的jre庫是1.5的,這可能會致使一些語法問題(例如泛型的語法問題),因此一般須要更改這個引用的jre庫版本。
<profile> <id>jdk18</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> <maven.compiler.encoding>utf-8</maven.compiler.encoding> </properties> </profile>
方式一:手動添加,經過手動拷貝等方式統一增長。能夠百度包名+maven
來查找依賴信息的寫法,拷貝下來粘貼到pom.xml中便可。
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
方式二:在eclipse,雙擊打開pom.xml,默認狀況下不是xml界面,點擊下面的dependencies選項,再點擊add,在中間的搜索框輸入信息搜索依賴,選擇依賴包,最後點擊確認。這要求你比較熟悉須要哪些包。
有時候咱們但願給maven工程添加額外的插件,例如tomcat7:run插件,這個插件能使得咱們的工程虛擬地部署到tomcat中。
mvn tomcat:run 命令是一個插件,須要添加才能執行這條命令,添加方式:項目右鍵選擇maven,再add plugin,而後搜索tomcat
<!--build與dependencies是同一級的 --> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> <configuration> <!-- 端口 --> <port>8080</port> <!-- 訪問路徑 --> <path>/helloworld</path> <!-- 編碼 --> <uriEncoding>utf-8</uriEncoding> </configuration> </plugins> </build>
這裏僅僅給一個添加插件的示例,其餘的插件有興趣能夠自查。
工程右鍵->run as ->第一個maven build可讓你選擇以前執行過的命令來執行,第二個maven build可讓你輸入指定命令來執行(在goals中輸入命令,mvn test只須要輸入test便可);至於後面的clean,install和test的意思已經顯而易見了。
若是想建立一個web工程,須要在建立工程的時候打包方式改爲war。但默認狀況下src/main下是沒有webapp目錄(存放WEB-INF目錄和web.xml的目錄)的。
什麼是依賴範圍衝突呢?這涉及到依賴範圍問題,主要是provided問題。以servlet-api依賴爲例,這個依賴tomcat會提供給咱們部署的項目,但若是咱們添加這個依賴的時候選擇了compile,那麼這個依賴也會帶到部署的項目中,使得存在了兩個servlet-api依賴。
解決方法:這時候要修改servlet-api依賴的範圍,改爲provided。
這個在pom配置的依賴排除中講過了。這裏只提一下,再也不演示。
mvn exec
。tomcat7:run
工程的拆分是建立一個核心父工程,而後建立多個子模塊的狀況。核心父工程通常不會編寫什麼內容,通常只做爲依賴的彙總(讓父工程引入共有依賴,子工程單獨依賴的單獨引入)。
爲了讓父工程能管理到子工程,因此在父工程下右鍵"new-->maven module"
建立完父工程和子模塊後,能夠在父工程的pom.xml中看到父工程管理到了子模塊:
而子模塊也指向了父工程:
而後子模塊怎麼開發呢?它至關於與一個獨立的模塊,因此你能夠像往常同樣開發。不過提一下的是,可能會發生service層調用dao層,那麼這怎麼實現呢?這就須要咱們在service層中添加dao層的依賴了,這樣service層就能夠調用dao層的方法了。
這裏提一下工程拆分與框架整合的問題,在之前一個工程中,dao和service都是交給spring去管理的,那麼如今
該怎麼處理呢?首先,要注意的是,只要咱們配置了spring(這裏注意,依賴已經導入了),不管是xml仍是註解
式,那麼spring就可以管理好咱們的bean。因此,咱們如今其實只須要關心咱們的bean是否交給了spring來管理
便可。而這個單個模塊的測試能夠在test目錄下再編寫代碼來測試。
拆分工程以後,開發完成了,怎麼聚合使用呢?
首先,要注意父工程管理着子模塊,
若是打包父工程,那麼子工程也會進行打包。
而一般咱們在進行web開發的時候,因爲子模塊web是核心項目,而子模塊web又依賴着子模塊service,而在打包的時候依賴的包也會打成jar包,因此打包子模塊web的時候,web工程的lib裏面是有依賴的兄弟工程的,因此咱們能夠直接運行web工程便可。【這是運行war包的狀況】
咱們也能夠選擇在IDE中直接運行子模塊web(在eclipse直接run as),也是可以調用到其餘兄弟模塊的功能的。
這篇關於maven的博文看完了,你應該能對maven的使用有一個基本的瞭解。
這裏給一個經常使用的查maven的依賴信息的網站:mvnrepository.com