前言
Hadoop的MapReduce環境是一個復雜的編程環境,所以我們要盡可能地簡化構建MapReduce項目的過程。Maven是一個很不錯的自動化項目構建工具,通過Maven來幫助我們從復雜的環境配置中解脫出來,從而標准化開發過程。所以,寫MapReduce之前,讓我們先花點時間把刀磨快!!當然,除了Maven還有其他的選擇Gradle(推薦), Ivy….
目錄
Maven介紹
Maven安裝(win)
Maven插件安裝
Maven常用命令
創建一個簡單的Maven項目
Maven基礎概念介紹
1. Maven介紹
Apache Maven,是一個Java的項目管理及自動構建工具,由Apache軟件基金會所提供。基於項目對象模型(Project Object Model))概念,Maven利用一個中央信息片段能管理一個項目的構建、報告和文檔等步驟。曾是Jakarta項目的子項目,現為獨立Apache項目。
maven的開發者在他們開發網站上指出,maven的目標是要使得項目的構建更加容易,它把編譯、打包、測試、發布等開發過程中的不同環節有機的串聯了起來,並產生一致的、高質量的項目信息,使得項目成員能夠及時地得到反饋。maven有效地支持了測試優先、持續集成,體現了鼓勵溝通,及時反饋的 軟件開發理念。如果說Ant的復用是建立在"拷貝–粘貼"的基礎上的,那么Maven通過插件的機制實現了項目構建邏輯的真正復用。
2. Maven安裝(win)
下載Maven:http://maven.apache.org/download.cgi
下載最新的xxx-bin.zip文件,在win上解壓到: F:\Tools\DevelopTool\maven
並把maven/bin目錄設置在環境變量PATH:F:\Tools\DevelopTool\maven\bin
3. Maven插件安裝配置
Maven插件安裝配置參見:http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html
4. Maven常用命令
mvn的命令有很多,在項目開發中,理解了下面的幾個常用命令后,運用maven就沒有問題了。
(1) 常用的mvn命令
mvn archetype:create 創建 Maven 項目
mvn compile 編譯主程序源代碼,不會編譯test目錄的源代碼。第一次運行時,會下載相關的依賴包,可能會比較費時
mvn test-compile 編譯測試代碼,compile之后會生成target文件夾,主程序編譯在classes下面,測試程序放在test-classes下
mvn test 運行應用程序中的單元測試
mvn site 生成項目相關信息的網站
mvn clean 清除目標目錄中的生成結果
mvn package 依據項目生成 jar 文件,打包之前會進行編譯,測試
mvn install 在本地 Repository 中安裝 jar。
mvn eclipse:eclipse 生成 Eclipse 項目文件及包引用定義
mvn deploy 在整合或者發布環境下執行,將最終版本的包拷貝到遠程 的repository,使得其他的開發者或者工程可以共享。
(2) 一些高級功能命令
跳過測試類 : -Dmaven.test.skip=true
下載jar包源碼: -DdownloadSource=true
下載javadocs: -DdownloadJavadocs=true
例如:
mvn package -Dmaven.test.skip=true :表示打包時忽略掉test目錄,不編譯。
mvn install -DdownloadSource=true :本地安裝jar包時,下載jar的源文件包。
讓我們從開發一個十分簡單的例子開始探究Maven的核心概念。通過學習,你將會對構建生命周期 (buildlifecycle),Maven倉庫 (repositories),依賴管理 (dependency management)和項目對象模型 (Project Object Model)有一個基本的理解。
5. 創建一個簡單的Maven項目
(1)mvn創建項目
01. JAVA項目:mvn archetype:create - DgroupId=net.bwda -DartifactId=common
02. web 項目: mvn archetype:create - DgroupId=net.bwda -DartifactId=web-app - DarchetypeArtifactId=maven-archetype- webapp
默認情況下:
源代碼在:{basedir}/src/main/java
資源文件在:{basedir}/src/main/resources
測試代碼在:{basedir}/src/test
(2) 創建一個簡單的項目
mvn archetype:create -DgroupId=org.sonatype.mavenbook.ch03 -DartifactId=simple -DpackageName=org.sonatype.mavenbook
mvn :是Maven2的命令。
archetype:create:是一個Maven目標,用來創建一個入門項目的骨架。
-Dname=value對:是將被傳到目標中的參數。它們使用-D屬性這樣的形式,類似於你通過命令行向Java虛擬機傳遞系統屬性。
(3) 參數與項目分析
例如:archetype:create這個目標,通過 archetype快速創建一個項目。一個archetype被定義為"一個原始的模型或者類型",在它之后的參數與之匹配。Maven有許多可用的archetype,從生成一個簡單的Swing應用,到一個復雜的Web應用。最基本的 archetype,可用來創建一個入門項目的骨架。這個插件的前綴是"archetype",目標為"create"。
(4) mvn的標准目錄布局
通過上面,我們已經創建了一個基本的mvn項目。查看simple文件夾,目錄層次如下:
|---simple
|---pom.xml
|---src
|---main
|---java
|---test
|---java
以上的目錄層次是mvn的標准目錄布局
01.maven Archtype插件:創建了一個與artifactId匹配的目錄:simple。
02. pom.xml:每個項目都有一個pom.xml,里面有它的項目對象模型。描述這個項目配置的插件,聲明的依賴。也就是說,配置jar包依賴關系,倉庫地址等都是通過這個文件配置。
03. src/main目錄:用於存放項目的源碼了資源文件。這個目錄包含了一下java類和一些配置文件。在一個Java項目中,Java類放在src/main/java下面,而classpath資源文件放在src/main/resources下面。
04. src/test:存放項目的測試用例。在這個目錄下面,src/test/java存放像使用JUnit這樣的Java測試類。目錄src/test/resources下存放測試classpath資源文件。
(5) 構建項目
01. 進入控制台,cmd進入simple目錄
02. 輸入 mvn install命令,執行構建
03. 生成eclipse工程項目,輸入: mvn eclipse:eclipse,然后將工程導入到eclipse工程即可。
6. mvn基礎概念介紹
任何您想build的事物,Maven都可以認為它們是工程。 這些工程被定義為工程對象模型(Poject Object Model)。 一個工程可以依賴其它的工程;一個工程也可以由多個子工程構成。
(1) Maven坐標
Archetype插件,通過名字為pom.xml的文件創建了一個項目。這就是項目對象模型(POM),一個項目的聲明性描述。當Maven運行 一個目標的時候,每個目標都會訪問定義在項目POM里的信息。
jar:jar目標:需要創建一個JAR文件的時候,它通過觀察POM來找出這個Jar文件的名字。
compile:compile任務:編譯Java源代碼為字節碼的時候,它通過觀察POM來看是否有編譯目標的參數。
(2) POM信息
目標在POM的上下文中運行。目標是我們希望針對項目運行的動作,而項目是通過POM定義的。POM為項目命名,提供了項目的一組唯一標識符,並且通過依賴 (dependencies) ,父 (parents) 和先決條件 (prerequisite) 來定義和其它項目的關系。POM也可以自定義插件行為,提供項目相關的社區和開發人員的信息。Maven坐標定義了一組標識,它們可以用來唯一標識一個項目,一個依賴,或者MavenPOM里的一個插件。Pom.xml的元素信息如下:
<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>org.sonatype.mavenbook.ch03</groupId>
<artifactId>simple</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>simple</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
GroupId:團體,公司,小組,組織,項目,或者其它團體。groupId是一個工程的在全局中唯一的標識符,一般地,它就是工程名。groupId有利於使用一個完全的包名,將一個工程從其它有類似名稱的工程里區別出來。
Artifact:在groupId下的表示一個單獨項目的唯一標識符。artifact是工程為要產生或需要使用的文件,生成一個標識符。這些文件可以是 jar文件,源文件,二進制文件,war文件,甚至是pom文件。每個artifact,由groupId和artifactId組合的標識符唯一識別。需要 被使用的artifact都要放在倉庫中,否則 Maven無法找到它們。
version:一個項目的特定版本。發布的項目有一個固定的版本標識來指向該項目的某一個特定的版本。而正在開發中的項目可以用一個特殊的標識,這種標識給版本加上一個"SNAPSHOT"的標記。
Packaging項目的類型:默認是jar,描述了項目打包后的輸出。類型為jar的項目產生一個JAR文件,類型為war的項目產生一個web應用。包括EAR、WAR、JAR、ZIP、EJB幾種類型。
項目的打包格式也是Maven坐標的重要組成部分,但是它不是項目唯一標識符的一個部分。一個項目的groupId:artifactId:version使之成為一個獨一無二的項目;你不能同時有一個擁有同樣的groupId, artifactId和version標識的項目。
Dependency:為了能夠build或運行,一個典型的Java工程會依賴其它的包。在Maven中,這些被依賴的包就被稱為 dependency。dependency一般是其它工程的artifact。
Plug-in:Maven是由插件組織的,它的每一個功能都是由插件提供的。插件提供goal,並根據在POM中找到的元數據去完成工作。主要的Maven插件要是由Java寫成 的,但它也支持用Beanshell或Ant腳本寫成的插件。
Repository:倉庫用於存放artifact,它可以是本地倉庫,也可以是遠程倉庫。Maven有一個默認的遠程倉庫--central,可以下載其中的artifact。在Windows 平台上,本地倉庫的默認地址是User_Home.m2.Repository。
Snapshot:工程中可以有一個特殊版本,它的版本號 包括SNAPSHOT字樣。該版本可以告訴Maven,該工程正處於開發階段,會經常更新(但還未發布)。當其它工程使用此類型版本的artifact 時,Maven會在倉庫中尋找該artifact的最新版本,並自動下載、使用該最新版。
(3) Maven倉庫(Repositories)
當你第一次運行Maven的時候,你會注意到Maven從一個遠程的Maven倉庫下載了許多文件。如果這個簡單的項目是你第一次運行 Maven,它首先會做的事情是去下載最新版本的Resources插件。在Maven中,構件和插件是在它們被需要的時候從遠程的倉庫取來的。 Maven自帶了一個用來下載Maven核心插件和依賴的遠程倉庫地址(http://repo1.maven.org/maven2),現已變更到 http://search.maven.org/。
Maven倉庫是通過結構來定義的,在一個Maven倉庫中,所有的東西存儲在一個與Maven項目坐標十分匹配的目錄結構中。 你可以訪問Maven倉庫http://search.maven.org/,搜索commons-io。你能在結果中找到相應的 commons-io所對應的pom.xml,將該配置拷貝到你本地的pom。在Windows上,你的本地倉庫C:\Documents and Settings\USERNAME\.m2\repository。在Unix系統上,你的本地倉庫在~/.m2/repository。
當你執行mvn install時,把你項目的構件安裝到你的本地倉庫。Maven會從遠程倉庫下載構件和插件到你本機上,存儲在你的本地Maven倉庫里。一旦 Maven已經從遠程倉庫下載了一個構件,它將永遠不需要再下載一次,因為maven會首先在本地倉庫查找插件,然后才從其他設置的倉庫獲取。
(4) Maven依賴管理
上面的例子中,Maven處理了JUnit依賴的坐標:junit:junit:3.8.1,指向本地Maven倉庫中的/junit/junit /3.8.1/junit-3.8.1.jar。這種基於Maven坐標的定位構件的能力能讓我們在項目的POM中定義依賴。如果你檢查simple項目 的pom.xml文件,你會看到有一個文件中有一個段,專門處理dependencies,那里面包含了一個單獨的依賴:JUnit。
一個復雜的項目將會包含很多依賴,也有可能包含依賴於其它構件的依賴。這是Maven最強大的特征之一,它支持了傳遞性依賴(transitive dependencies)。假如你的項目依賴於一個庫,而這個庫又依賴於五個或者十個其它的庫。你不必找出所有這些依賴然后把它們寫在你的pom.xml里,你只需要加上你直接依賴的那些庫,Maven會隱式的把 這些庫間接依賴的庫也加入到你的項目中。Maven也會處理這些依賴中的沖突,同時能讓你自定義默認行為,或者排除一些特定的傳遞性依賴。
如果,您認為閱讀這篇博客讓您有些收獲,不妨點擊一下右下角的【推薦】。
如果,您希望更容易地發現我的新博客,不妨點擊一下左下角的【關注我】。
如果,您對我的博客所講述的內容有興趣,請繼續關注我的后續博客,我是【Sunddenly】。本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。