本人從事JAVA編程已經有一些年月了(咳咳咳咳咳~喝一口茶),基本上在每次的項目開發過程當中都會使用一些集成工具,好比說Maven或是Gradle。最近在寫一個項目,可是項目在打包的過程當中出現了問題,對把MAVEN一直看成傻瓜工具來使用的我徹底不知道如何去解決這些問題。因此如今我想從新來了解一下這個工具,並用一種通俗易懂的方式來解釋這個工具的用意。html
本教程適用於如下兩種人:java
這裏歡迎全部人對文中的問題提出質疑,你們的意見筆者將很是珍惜!程序員
安裝MAVEN
官網上給出了六個單詞做爲MAVEN的用途,分別是web
這幾個詞乍一看來什麼都沒表述。那麼我就用一些具體的例子來講明。面試
對於初次接觸JAVA的同窗來講,在Eclipse中寫一個類,其中包含一個main方法,而後點擊一下運行鍵,就能夠將代碼運行起來。
可是,真實世界中的項目每每十分複雜,首先,一個項目會有一個開發過程的生命週期,其中和程序員緊密相關聯的步驟包括:開發,測試,集成,打包,部署。而在這些過程當中,每每須要衆多的程序員齊心合力完成,一個步驟可能有多個程序員並行的進行實現。更麻煩的是,在迭代開發過程當中,每每會產生多個版本的產品,這些版本之間既具備共同性,又具備差別性。如何才能將各個版本進行有效的管理呢?不只如此,在各個不一樣的開發時期,每每伴隨着人員的調動,一個新入組的程序員如何才能更快的對項目進行了解從而投入工做呢?apache
這就引來了一個問題,如何才能保證每一個程序員的工做成果對彼此可見,從而使每一個人之間的合做更加流暢,而不是產生衝突和冗餘。編程
MAVEN就此而生。它更像是達成的某種共識。你們按照這種共識進行程序的開發。MAVEN定義了一系列開發規範,好比包的命名和功能,項目的命名等等。MAVEN中還實現了許多功能,好比自動構建,自動對依賴進行管理,自動生成項目文檔等。在MAVEN的幫助下,開發人員能夠儘量的專一於代碼的編寫,而不是去寫冗長的項目說明文檔,或是進行重複的項目構建和複雜的配置管理。微信
MAVEN本質上是一個終端工具,可是不少IDE(集成開發環境)都配有MAVEN插件,所以不少人在初次接觸MAVEN使都會使用圖形工具操做它。這樣並不有利於學習MAVEN。建議你們之後儘可能使用命令行來操控MAVEN,在熟練之後再使用圖形化工具。app
先打開終端(CMD或TERMINAL)進入項目目錄後輸出如下指令:webapp
mvn -B archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=com.mycompany.app \ -DartifactId=my-app
這個指令聲明瞭項目的名稱(artifactId),項目所屬的組織(groupId),以及項目初始化時使用的maven模板。
第一次使用MAVEN建立項目會比較慢,由於它會初始化一些內容。
執行完畢後會產生以下如所示的目錄結構,其中根目錄名稱爲artifactId的值(在這裏是my-app)。
具體狀況以下:
在這裏咱們簡單介紹一下根目錄下各個組件的用途。
注:${basedir}是指項目的根目錄,好比在個人電腦上就是/users/rale/my-app
${basedir}/src/main/java
:這個目錄下放置了項目的源代碼,其中按照初始化時groupId的屬性建好了包,每一級域名對應一個文件夾。這是MAVEN默認的建包規範。
${basedir}/src/main/java
:這個目錄下放置了項目的測試代碼,而且在項目打包的時候不會被裝入包中。這個目錄底下的文件夾格式和main底下的文件夾格式相同。
pom.xml
:這個文件能夠說是MAVEN的核心文件,在下面詳細說明。
初始化後的pom文件內容以下。
<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.mycompany.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>
在pom中包含了當前項目管理的所有信息。pom文件採用XML的格式存儲項目的配置信息(對於XML文件不熟悉的童鞋能夠自行百度,這篇文章就不詳細描述其語法了)。先簡單介紹一下上圖這個簡單的pom文件中的內容:
project
: XML文件中的頂層元素
modelVersion
: POM採用的模型的版本,這個元素不多改動
groupId
: 開發這個項目的組織的惟一的標識號,通常採用域名的倒序
artifactId
: 這個項目產品的名稱
packaging
: 打包的格式
version
: 打包出來的版本
name
: 項目的展現名稱,一般用於MAVEN生成的文檔中
url
: 項目的網址,一般用於MAVEN生成的文檔中
description
: 項目的基本描述,一般用於MAVEN生成的文檔中
此時maven生成的App.java文件中有一個自動實現好的hello world實例,咱們能夠直接編譯項目並運行。
在項目的根目錄下執行mvn test
,maven會自動生成對應的.class文件位於${basedir}/target/classes
目錄下而且執行測試。能夠看到下圖的輸出結果中說明一共一個測試用例,而且沒有失敗的測試用例。
以後使用指令mvn package
打包,打包生成的文件默認路徑爲${basedir}/target
。
至此咱們已經完成了MAVEN的最基本操做。
這裏給出了添加MAVEN編譯器插件的例子。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build>
Maven中的插件能夠附着在編譯過程的不一樣的聲明週期。一共能夠分爲兩種類型的插件,一種是用於編譯的插件,一種是用於生成報告的插件。編譯的插件應當聲明於<build>模塊,而報告的插件應當聲明於<reporting/>模塊
全部的插件須要至少三個信息,groupId, artifactId和version
對於每一個插件再在本身的configuration標籤下詳細定義。
關於plugin更多內容請參考這個網址
這裏給出了添加Junit依賴的例子
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies>
添加一個Dependency至少須要聲明四個屬性:groupId, artifactId, version, 和scope。其中scope是指在編譯的哪一個階段使用該依賴,其值能夠爲compile test和runtime
。
默認狀況下,全部的依賴文件都位於${user.home}/.m2/repository
目錄下。Maven會將不在本地的依賴下載至這個目錄,而且在項目中指向這個依賴。
這裏可能會對Plugin和Dependency這兩個概念之間產生一些困惑,彷佛兩者都是經過引用外部的工具完成當前項目的開發。可是這兩個實際上是徹底不一樣的兩個概念。
插件會綁定到指定的生命週期上,在特定的生命週期上觸發。咱們不會使用插件協助咱們編程。
可是依賴是指咱們會使用依賴的文件幫助開發,例如鼎鼎有名的JUnit
。咱們會使用裏面的部分功能進行再次編碼開發。
首先,咱們須要知道的是,pom文件是能夠繼承的。也就是說,咱們能夠有父pom文件和多個子pom文件。目錄格式以下:
+- pom.xml +- my-app | +- pom.xml | +- src | +- main | +- java +- my-webapp | +- pom.xml | +- src | +- main | +- webapp
在父pom中應當聲明以下語句,將各個模塊添加進來
<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.mycompany.app</groupId> <artifactId>app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>my-app</module> <module>my-webapp</module> </modules> </project>
由於my-webapp須要my-app的依賴,所以在my-webapp/pom.xml文件中添加以下語句
<dependencies> <dependency> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> </dependency> ... </dependencies>
最後在my-webapp/pom.xml和my-app中都添加以下語句繼承父pom文件
<parent> <groupId>com.mycompany.app</groupId> <artifactId>app</artifactId> <version>1.0-SNAPSHOT</version> </parent>
最後在項目的總根目錄執行mvn verify
能夠看到項目開始一塊兒編譯
mvn archetype:create -DgroupId=packageName -DartifactId=projectName
:建立一個普通的MAVEN項目
mvn archetype:create -DgroupId=packageName -DartifactId=webappName -DarchetypeArtifactId=maven-archetype-webapp
: 建立一個MAVEN的web應用
mvn compile
:編譯源代碼
mvn test
: 執行測試
mvn test-compile
: 編譯源代碼和測試代碼
mvn package
: 將項目打包成packaging
標籤下聲明的格式,在這裏是JAR格式。默認狀況下,生成的JAR包位於${basedir}/target
目錄下。
mvn compile
:
mvn clean
: 清除以前的編譯結果,直觀的來看就是刪除${basedir}/target
文件夾
mvn site
: 自動生成項目簡介的網站
mvn verify
:運行任何檢查,驗證包是否有效且達到質量標準
本文還將持續更新~~~
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注個人微信公衆號!將會不按期的發放福利哦~