HELLO!大家好!這是咕嚕的第一篇博客,還請前輩們多包涵!!咕嚕大大,專注編程和單身30年!
尊重原創,請大家轉載時註明該文章來自:http://blog.csdn.net/ymh198816/article/details/42528197
正如大家所知的,maven是Apache底下的一個項目構建和管理工具,主要的功能有項目中依賴的jar包管理,項目的構建(build),清理,編譯,打包部署,運行測試用例,生成報告和文檔,軟件配置管理,發佈管理等等(要活用“等等”這個詞,當你不知道這玩意還有什麼功能時,寫上“等等”,就會顯得很專業的趕腳)。在構建JavaEE項目時,很多人的第一反應就是要上SSH框架,因爲上框架能實現項目的工業化開發,提高代碼的複用性和可維護性,解耦合,方便模塊化層次化開發,好處自然不言而喻。但問題就在於要使用這些框架,就得往項目中下載不同的依賴包,哪怕是隻使用最基本的3個框架功能:數據庫持久化+依賴注入+前端控制,也需要下載20多個jar包,不光名字難以記全,還可能因爲版本不一致的問題導致jar衝突,這對開發人員來說簡直是一個噩夢!所以,這時候就要請ApacheMaven出馬了,maven提倡一個理念:約定大於配置(Convention Over Configuration),只要你遵守maven的項目配置約定(比如說:創建的項目目錄結構得是:/src/main/java),就只用在pom.xml中填寫少量的配置,maven便能幫你把項目自動管理起來,下載依賴包,清理構建部署等等,十分方便!
下載安裝maven
maven是一個Java工具,所以使用maven之前必須要在系統中安裝JDK。
maven的官方下載傳送門:http://maven.apache.org/download.cgi
將下載下來的bin tar.gz文件解壓縮並放在你想要的目錄下,目前最新的maven版本是3.2.5.
接下來在你的mac操作系統中打開命令行終端,並在裏面添加一個maven2文件bin目錄地址的變量:
>>export M2=/your/path/apache-maven-3.2.5/bin
然後將剛剛的地址變量加入到系統中的path環境變量裏, 並輸出在bash_profile文件裏
>>echo "export PATH=$M2:$PATH" >> ~/.bash_profile
>>source ~/.bash_profile
沒報錯的話,最後運行
>>mvn --version
如果出現下面的內容,恭喜你已經成功安裝maven2在你的mac系統上了。
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T01:29:23+08:00)
Maven home: /Users/apple/Documents/apache-maven-3.2.5
Java version: 1.6.0_65, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: zh_CN, platform encoding: EUC_CN
OS name: "mac os x", version: "10.9.5", arch: "x86_64", family: "mac"
創建maven項目
在maven中使用archetype機制去構建一個項目,archetype是一個通用的maven項目的模板管理工具,用戶也可以通過archetype爲自己的EJB,SPRING項目建立模板。
打開你的命令行並使用archetype命令去創建一個符合maven約定的項目。
>>mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.guludada.maven -DartifactId=my-maven
第一次創建可能時間會比較久,因爲會下載許多依賴包。 DarchetypeGroupId是該模板所屬的機構(group);DgroupId是你自己的項目所屬的機構,使用倒敘域名的寫法;DartifactId是你項目的名稱; (其中“archetype:create”已不推薦使用)
在當前目錄下,archetype就會創建如下目錄結構的maven項目:
--my-maven
--pom.xml
--src
|--main
--jave
--com
--guludada
--maven
--App.java
|--test
--java
--com
--guludada
--maven
--AppTest.java
一個標準的maven項目目錄結構中,包含一個pom.xml文件,以及項目業務源碼的存放目錄${DartifactId}/main/java和測試源碼的存放目錄${DartifactId}/test/java
同時,你還可以使用 “-DarchetypeArtifactId=${template_name}”指定模板去創建maven項目,默認情況下,如果不明確指明用哪個模板去創建項目,系統會使用“-DarchetypeArtifactId=maven-archetype-quickstart”模板去創建項目,如上所示;如果你想創建一個webapp項目,你可以在使用archetype命令時明確指出:“-DarchetypeArtifactId=maven-archetype-webapp”,或者你也可以自定義自己的archetype模板。
maven的核心:pom.xml
在maven工程下,你會看見pom(Project Object Model)文件,它是maven項目的核心也是最本的maven元素。pom文件記錄着關於項目的信息以及被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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.guludada.maven</groupId>
<artifactId>my-maven</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-maven</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
“<project>”是pom.xml的頂級元素。
“<modelVersion>”是指當前pom的版本,一般就默認配置就好了
"<groupId>"是指這個項目創建者的ID,一般就是公司域名的倒敘,如:com.guludada
"<artifactId>"是指這個項目產生的可運行軟件的名稱,並遵循<artifactId>-<version>.<extension>的格式,如上maven產生的jar包名就是:my-maven-1.0.jar
"<packaging>"是指項目打包的格式,如:jar,war,ear等,默認情況下是jar
"<version>" 指的是該項目的版本,maven有自己的一套項目版本管理機制,如上所示-snapshot的指示符標明該項目處於開發階段
"<name>"指的是該項目的名稱,通常被用在maven生成的文檔中
"<url>"指的是該項目部署的域名,通常被用在maven生成的文檔中
一個最輕量最基本的pom文件必須包含:“<project>”,“<modelVersion>”,"<groupId>","<artifactId>","<version>"這5個元素。
同時,所有項目的pom文件都會繼承一個父類pom文件:super pom,如下所示:
<project>
<modelVersion>4.0.0</modelVersion>
<name>Maven Default Project</name>
<repositories>
<repository>
<id>central</id>
<name>Maven Repository Switchboard</name>
<layout>default</layout>
<url>http://repo1.maven.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
<build>
<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<finalName>${artifactId}-${version}</finalName>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
</build>
<reporting>
<outputDirectory>target/site</outputDirectory>
</reporting>
……………………………………
</project>
上面的super pom只列了一部分內容,主要是要讓大家看“<build>”元素中的內容<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
這裏就約定了maven的目錄結構是:src/main/java的結構,所以沒有什麼類似不改會死的需求的話,就不要去改這個maven約定的項目目錄結構了,畢竟是很多開發人員總結出來的項目目錄結構。 Maven2的包管理
最爲大家熟悉的就是Maven的包管理機制了,只要配置好pom.xml文件,maven就會自動幫你下載管理項目所需要用的依賴包。構建項目時,maven會先去~/.m2/repository下尋 找項目中需要用到的依賴包,如果沒有的話,maven就會去遠程庫(http://repo.maven.apache.org/maven2/)中下載依賴包到本地中來。
<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.guludada.upload</groupId>
<artifactId>my-UploadWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-UploadWeb Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>my-UploadWeb</finalName>
</build>
</project>
如上所示,只要在pom.xml根據項目需要,使用“<dependencies>”標籤添加要依賴的jar包庫信息,maven就會幫你自動將jar包管理起來。
“grouid”,“artifactid”和“version”和之前提到的含義是相同的,這裏多了一個“<scope>”標籤,這個scope標籤是指明項目在什麼時候使用這些依賴包,默認下是“compile”,這裏是指定爲“test”,意思就是隻有當項目的測試模塊編譯和運行時才使用這個junit依賴包。
無圖無真相,無例無內涵
這裏通過一個簡單的例子來演示如何用maven構建你的項目。
首先打開命令行,用archetype來構建maven項目,並且指定“-DarchetypeArtifactId=maven-archetype-webapp”,這樣創建的maven項目目錄下面就會有一個webapp的目錄
>>mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.guludada.upload -DartifactId=my-UploadWeb
然後使用Eclipse的"File"-->"Import"功能將剛剛創建好的maven項目導進來,選擇“Existing Maven Projects”
可以看見導入剛剛創建好的maven項目後的目錄結構如下圖所示:
我們會發現剛創建的maven項目報錯了,沒關係,我們現在來解決。從項目錯誤來看,提示的是找不到“javax.servlet.http.HttpServlet”找不到。首先右鍵點擊項目,並選擇“Properties” --> "Project Facets", 你會看見Eclipse自動爲你勾選了 “Dynamic Web Module” 模板,所以項目中必須要有servlet-api的jar包,而servlet一般由容器生成,所以我們這時候要去檢查TOMCAT的jar包有沒有導入到項目中來。
接下來,選擇“Java Build Path”,我們會看見裏面的“Libraries”選項卡中只有“JRE System Libraries”和“maven dependencies”兩個jar包庫,這是遠遠不夠的;需要點擊右邊的“Add Library”按鈕,選擇添加“Server Runtime”(Tomcat的lib庫),“Web App Libraries”和“EAR Libraries”(企業級應用EJB的依賴庫)3個jar包庫;
添加完依賴包後,你會發現Eclipse自動幫你構建了“src/main/java”文件目錄。右鍵點擊項目,選擇“Properties”-->"Deployment Assembly",如果裏面沒有“Maven Dependencies”,則需要點擊右邊的“add…”-->"Java Build Path Entries"-->"Maven Dependencies"添加進去。
這時候一個完整的maven web項目就構建完成了,之前的錯誤也消失了,可以開始實現上傳文件的程序了。(如果仍然報錯,可以右鍵點擊項目選擇“Validate”,就會好了)
最後一步就是要在pom文件中中配置該項目要使用到的依賴包(通過“<dependency>”標籤),並點擊保存(或打開命令行輸入mvn compile),那麼maven就會從遠程依賴庫中下載該項目要用到的依賴包到本地依賴庫中。
這樣一個完整的maven項目就算構建完成了。接下來開始寫業務代碼吧。
很多朋友會問到,這裏maven的目錄結構爲src/main/java/com/guludada/UploadWeb或"src/main/webapp",我們在配置web.xml文件或者在servlet中寫要調用的jsp或servlet的地址,是不是要寫全maven的目錄結構?答案是否定的!!右鍵點擊項目,選擇“Properties”-->"Deployment Assembly",你會發現“src/main/java”目錄下的文件都直接構建在WEB-INF/classes目錄下,所以在web.xml配置文件下,就像平常那樣在“<servlet-class>”標籤裏直接寫上“com.guludada.uploadApp.app”,而不用再寫上”src/main/java“目錄了。同理,“src/main/webapp”下的文件全部構建在“/”目錄下,所以在servlet中調用jsp時,直接寫上“request.getRequestDispatcher("index.jsp").forward(request, response)”就可以了,而不用再帶上“request.getRequestDispatcher("src/main/webapp/index.jsp").forward(request, response)”前綴地址。
小技巧
當在不同項目的pom文件中自定義不同的遠程倉庫,並且想要更換某一個項目的倉庫時,你可以在${user.home}/.m2/settings.xml中自定義你某個項目裏遠程倉庫的鏡像,而不用改變原有項目的pom文件。其中<mirrorOf>和pom文件中<repository>標籤下的<id>一致。這樣你就可以用下面配置的新倉庫地址去更換原有項目中pom文件裏配置的倉庫地址了。
<settings>
...
<mirrors>
<mirror>
<id>CHN</id>
<name>CHN Central</name>
<url>http://your/repository/addr/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
目前maven2的遠程倉庫的官方地址是:位於米國的http: //repo.maven.apache.org/maven2, 和腐國的 http://uk.maven.org/maven2. 不過沒啥事就不要去改這個默認配置了,反正我用着挺溜的。
好了,最後希望這篇文章對大家能有幫助!