Maven學習第4期---Maven簡單使用

1、Maven經常使用命令

在學習使用Maven構建項目以前,先來了解一下Maven一些實用的命令。mvn的命令有不少,在項目開發中,理解了下面的幾個經常使用命令後,運用maven就基本沒有問題了。Maven經常使用的命令以下:java

1.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
,使得其餘的開發者或者工程能夠共享。web

1.2 一些高級功能命令

跳過測試類 : -Dmaven.test.skip=true apache

下載jar包源碼: -DdownloadSource=true 安全

下載javadocs: -DdownloadJavadocs=true app

例如: 框架

mvn package -Dmaven.test.skip=true :表示打包時忽略掉test目錄,不編譯。
mvn install -DdownloadSource=true :本地安裝jar包時,下載jar的源文件包。 dom

2、Maven簡單使用

到目前爲止,咱們已經大概瞭解並安裝好了Maven。爲了進一步學習Maven,咱們和其餘項目一樣以一個最簡單的HelloWorld項目開始,探究Maven的核心概念。經過對該項目的學習,來讓咱們對構建生命週期 (Build Life Cycle),Maven倉庫 (Repositories),依賴管理 (Dependency Management)和項目對象模型 (Project Object Model)有一個基本的理解。 eclipse

2.1 編寫POM

就像MakeMakefileAntbuild.xml同樣,Maven項目的核心是pom.xml。POM(Project Object Model),項目對象模型定義了項目的基本信息,用於描述項目如何構建,聲明項目依賴,等等。如今先爲HelloWorld項目編寫一個最簡單的pom. xml, maven

首先建立一個名爲helloworld的文件夾,打開該文件夾,新建一個名爲pom.xml的文件,輸入其內容,如代碼清單以下所示: 編輯器

<?xml version="1.0" encoding="UTF-8"?>

<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.hebut.test</groupId>

    <artifactId>helloworld</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <name>Maven Hello World Project</name>

</project>

XML頭

代碼的第一行是XML頭,指定了該xml文檔的版本編碼方式

project元素

XML頭以後緊接着就是project元素,project是全部pom.xml的根元素,它還聲明瞭一些POM相關的命名空間xsd元素,雖然這些屬性不是必須的,但使用這些屬性可以讓第三方工具(如IDE中的XMl編輯器)幫助咱們快速編輯POM 。

modelVersion元素

根元素下的第一個子元素modelVersion,它指定了當前POM模型的版本,對於Maven 3以及Maven 3來講,它只能是4.0.0。

座標

這段代碼中最重要的是:包含groupIdartifactIdversion的三行。這三個元素定義了一個項目基本的座標,在Maven的世界,任何的jar、pom或者war都是以基於這些基本的座標進行區分的。

groupId元素

groupId定義了項目屬於哪一個組,這個組每每和項目所在的組織公司存在關聯。譬如在googlecode上創建了一個名爲myapp的項目,那麼groupId就應該是com.googlecod.myapp,若是你的公司是mycom,有一個項目爲myapp。耶麼groupId就應該是com.mycom.myapp。

artifactId元素

artifactId定義了當前Maven項目在組中惟一的ID咱們爲這個HelloWord項目定義artifactIdhello-world。在前面的groupld爲

com.googlecode.myapp的例子中,你可能會爲不一樣的子項目(模塊)分配artifactId,如myapp-util、myapp-domain、myapp-web等。

version元素

顧名思義,version指定了Hello World項目當前的版本0.0.1。SNAPSHOT意爲快照,說明該項目還處於開發中,是不穩定的版本。隨着項目的展,version會不斷更新,如升級爲0.0.二、0.0.三、1.0.0等。

name元素

最後一個name元素,聲明瞭一個對於用戶更爲友好的項目名稱,雖然這不是必須的,但仍是推薦爲每一個POM聲明name。以方便信息交流。

沒有任何實際的Java代碼,咱們就可以定義一個Maven項目的POM,這體現了Maven的一大優勢,它能讓項目對象模型最大程度地與實際代碼相獨立,咱們能夠稱之爲解耦,或者正交性這在很大程度上避免了Java代碼POM代碼的相互影響:好比當項目須要升級版本時,只須要修改POM。而不須要更改Java代碼;而在POM穩定以後,平常的Java代碼開發工做基本不涉及POM的修改。

2.2 編寫主代碼

項目主代碼測試代碼不一樣,項目的主代碼會被打包到最終的構件中jar。而測試代碼只在運行測試時用到,不會被打包。默認狀況下,Maven假設項目主代碼位於src/main/java目錄,咱們遵循Maven的約定,建立該目錄,而後在該目錄下建立文件org/hebut/test/helloworld/HelloWorld. java,其內容如代碼以下所示:

package org.hebut.test.helloworld

public class HelloWorld{

    public String sayHello(){

        return "Hello Maven";

    }

    public static void main(String[] args){

        System.out.println(new HelloWorld());

    }

}

這是一個簡單的Java類,它有一個sayHello()方法,返回一個String同時這個類還帶有一個main方法,建立一個HelloWorld實例,調用sayHello()方法,並將結果輸出到控制檯。

關於該Java代碼有兩點須要注意:首先,在絕大多數狀況下,應該把項目主代碼放到src/main/java/目錄下,而無須額外的配置,Maven會自動搜尋該目錄找到項目主代碼。其次,該Java類的包名是org.hebut.test.helloworld,這與以前在POM中定義的groupId和artifactld相吻合。通常來講,項目中Java類的包都應該基於項目的groupld和anifactId。這樣更加清晰,更加符合邏輯,也方便搜索構件或者Java類。

代碼編寫完畢後,使用Maven進行編譯,在項目的根目錄下運行命令mvn clean compile會獲得以下輸出:

執行完畢,發現項目根目錄多了一個target目錄:

上面使用的clean命令告訴Maven清理輸出目錄target/compile告訴Maven編譯項目主代碼,從輸出中看到Maven首先執行了clean:clean任務,刪除target/目錄。默認狀況下,Maven構建的全部輸出都在target/目錄中;接着執行resources:resources任務,未定義項目資源,暫且略過;

最後執行compiler:compile任務,將項目主代碼編譯至target/classes目錄,編譯好的類爲:

org/hebut/test/helloworld/HelloWorld.Class

上文提到的clean:cleanresources:resourcescompiler:compile對應了一些Maven插件插件目標,好比clean:cleanclean插件clean目標compiler:compilecompiler插件compile目

至此,Maven在沒有任何額外的配置的狀況下就執行了項目的清理和編譯任務。接下來,編寫一些單元測試代碼並讓Maven執行自動化測試。

2.3 編寫測試代碼

爲了使項目結構保持清晰,主代碼與測試代碼應陔分別位於獨立的目錄中。正如上面所述,Maven項目中默認的主代碼目錄src/main/java。對應地,Maven項目中默認的測試代碼目錄src/test/java。所以,在編寫測試用例以前,應當先建立該目錄。

2.3.1 設置依賴

在Java世界中,由Kent Beck和Erich Gamma創建的JUnit是事實上的單元測試標準。要使用JUnit,首先須要爲HelloWorld項目添加一個JUnit依賴,修改項目的POM代碼以下:

<?xml version="1.0" encoding="UTF-8"?>

<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.hebut.test</groupId>

    <artifactId>helloworld</artifactId>

    <version>0.0.1-SNAPSHOT</version>

<name>Maven Hello World Project</name>

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.7</version>

<scope>test</scope>

</dependency>

    </dependencies>

</project>

dependencies元素

代碼中添加了dependencies元素,該元素下能夠包含多個dependency元素以聲明項目的依賴

dependency元素

dependency元素用以聲明項目的依賴,這裏添加了一個依賴groupId是junit,artifactld是junit,version是4.7。前面提到groupId、artifactId和versIon是任何一個Maven項目最基本的座標。JUnit也不例外,有了這段聲明Maven就可以自動下載junit-4.7.jar。那麼,Maven從哪裏下載這個jar 呢?

在使用Maven以前,能夠去JUnit的官方網站下載分發包。有了Maven以後,它會自動訪問中央倉庫:

http://repo1.maven.org/maven2/,下載須要的文件。

固然與能夠本身訪問該倉庫,打開路徑junit/junit/4. 7/,就能看到junit-4.7.pom和junit-4.7.jar。

scope元素

上述POM代碼中還有一個值爲test的元素scope,scope爲依賴範圍,若依賴範圍爲test則表示該依賴只對測試有效。換句話說,測試代碼中的import JUnit代碼是沒有問題的,可是若是在主代碼中用import Junit代碼,就會形成編譯錯誤。若是不聲明依賴範圍,那麼默認值就是compile,表示該依賴對主代碼測試代碼都有效

2.3.2 編寫測試代碼

配置了測試依賴,接着就能夠編寫測試類。回顧一下前面的HelloWorld類,如今要測試該類的sayHello()方法,檢查其返同值是否爲"Hello Maven"。在src/test/java目錄下建立文件,其內容代碼以下所示:

package org.hebut.test.helloworld;

import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class HelloWorldTest{

    @Test

    public void testSayHello(){

        HelloWorld helloworld=new HelloWorld();

        String result=helloworld.sayHello();

        assertEquals("Hello Maven",result);

    }

}

一個典型的單元測試包含三個步驟:

準備測試類及數據;

執行要測試的行爲;

檢查結果。

上述樣例,首先初始化了一個要測試的HelloWorld實例接着執行該實例的sayHello()方法並保存結果到result變量中,最後使用JUnit框架的Assert類檢查結果是否爲咱們指望的"Hello Maven"。在JUnit 3中,約定全部須要執行測試的方法都以test開頭,這裏使用了JUnit 4,但仍然遵循這一約定。在JUnit 4中,須要執行的測試方法都應該以@Test進行標註。

測試用例編寫完畢以後就能夠調用Maven執行測試。運行mvn clean test

咱們看到compiler: testCompile任務執行成功了,測試代碼經過編譯以後在target/test-classes下生成了二進制文件:

緊接着surefire:test任務運行測試,surefire是Maven中負責執行測試的插件,這裏它運行測試用例HelloWorldTest,而且輸出測試報告,顯示一共運行了多少測試,失敗了多少,出錯了多少,跳過了多少二硅然,咱們的測試經過了。

2.4 打包安裝

將項目進行編譯測試以後,下一個重要步驟就是打包:package。 Hello WorldPOM中沒有指定打包類型,使用默認打包類型jar。簡單地執行命令:

mvn clean package進行打包,能夠看到以下輸出:

相似地,Maven會在打包以前執行編譯測試等操做,這裏看到jar: jar任務負責打包,實際上就是jar插件jar目標將項目主代碼打包成一個名爲helloworld-0.0.1-SNAPSHOT.jar的文件。該文件也位於target/輸出目錄中,它是根據artifact-version. jar規則進行命名的,若有須要,還可使用finalName來自定義該文件的名稱。

至此,咱們獲得了項目的輸出,若是有須要的話,就能夠複製這個jar文件到其餘項目的Classpath中從而使用HelloVV orld類。可是,如何才能讓其餘的Maven項目直接引用這個jar呢?還須要一個安裝的步驟,執行mvn clean install:

在打包以後,又執行了安裝任務install:install。從輸出能夠看到該任務將項目輸出的jar安裝到了Maven本地倉庫中,能夠打開相應的文件夾看到HelloWorld項目的pom和jar:

以前講述,JUnit的POM及jar的下載的時候,咱們說只有構件被下載到本地倉庫後,才能由全部Maven項目使用,這裏是一樣的道理,只有將HelloWorld的構件安裝到本地倉庫以後,其餘Maven項目才能使用它。

咱們已經體驗了Maven最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。執行test以前是會先執行Compile的,執行package以前是會先執行test的。而相似地,install以前會執行package。能夠在任何一個Maven項目中執行這些命令,並且咱們已經清楚它們是用來作什麼的。

2.4 運行

到目前爲止,尚未運行Hello World項目,不要忘了HelloWorld類但是有一個main方法的。默認打包生成的jar是不可以直接運行的,由於帶有main方法的類信息不會添加到manifest中,即打開jar文件中的META-INF/MANIFEST. MF文件,將沒法看到Main-Class一行。默認Maven生成的JAR包只包含了編譯生成的.class文件項目資源文件,而要獲得一個能夠直接在命令行經過java命令運行的JAR文件,還要知足兩個條件

■ JAR包中的/META-INF/MANIFEST.MF元數據文件必須包含Main-Class信息。

■ 項目全部的依賴都必須在Classpath中。

Maven有好幾個插件能幫助用戶完成上述任務,不過用起來最方便的仍是maven-shade-plugin, 它可讓用戶配置Main-Class的值,而後在打包的時候將值填入/META-INF/MANIFEST.MF文件。關於項目的依賴,它很聰明地將依賴JAR文件所有解壓後,再將獲得的.class文件連同當前項目的.class文件一塊兒合併到最終的CLI包中,這樣,在執行CLI JAR文件的時候,全部須要的類就都在Classpath中了。下面是一個配置樣例:

  1. <build>
  2.     <plugins>
  3.        <plugin>
  4.            <groupId>org.apache.maven.plugins</groupId>
  5.            <artifactId>maven-shade-plugin</artifactId>
  6.            <version>1.4</version>
  7.            <executions>
  8.              <execution>
  9.                <phase>package</phase>
  10.                <goals>
  11.                  <goal>shade</goal>
  12.                </goals>
  13.                <configuration>
  14.                  <transformers>
  15.                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  16.                      <mainClass>org.hebut.test.helloworld.HelloWorld</mainClass>
  17.                    </transformer>
  18.                  </transformers>
  19.                </configuration>
  20.              </execution>
  21.            </executions>
  22.        </plugin>
  23.     </plugins>
  24.    </build>

plugin元素在POM中的相對位置應該在<project><build><plugins>下面。咱們配置了mainClass爲org.hebut.helloworld.HelloWorld,項目在打包時會將該信息放到MANIFEST中。如今執行mvn clean install。待構建完成以後打開target/目錄,能夠看到helloworld-0.0.1-SNAPSHOT.jar和original-helloworld-0.0.1-SNAPSHOT.jar。前者帶有Main-Class信息可運行jar後者原始的jar,打開helloworld-0.0.1-SNAPSHOT.jar的META-INF/MANIFEST. MF。能夠看到它包含以下信息:

Manifest-Version: 1.0

Build-Jdk: 1.6.0_24

Built-By: hadoop

Created-By: Apache Maven 3.2.5

Main-Class: org.hebut.test.helloworld.HelloWorld

Archiver-Version: Plexus Archiver

如今,在項目根目錄中執行該jar文件:

E:\Test\helloworld>java -jar target\helloworld-0.0.1-SNAPSHOT.jar

Hello Maven

控制檯輸出爲Hello Maven,這正是咱們所指望的。

3、使用Archetype生成項目骨架

3.1 Maven 項目約定

HelloWorld項目中有一些Maven的約定:在項目的根目錄中放置pom.xml,在src/main/java目錄中放置項目的主代碼,在src/test/java中放置項目的測試代碼。咱們稱這些基本的目錄結構pom. xml文件內容稱爲項目的骨架。Maven項目的骨架以下:

|---MavenProject

|---pom.xml

|---src

|---main              

|---java

|---test

|---java

3.2 Maven Archetype

當第一次建立項目骨架的時候,你還會饒有興趣地去體會這些默認約定背後的思想,第二次,第三次,你也許還會滿意本身的熟練程度,但第4、第五次作一樣的事情,你可能就會惱火了。爲此Maven提供了Archetype以幫助咱們快速勾勒出項目骨架。仍是以Hello World爲例,咱們使用maven archetype建立項目的骨架,離開當前的Maven項目目錄。

若是是Maven 3簡單地運行:

mvn archetype:generate

若是是Maven 2最好運行以下命令:

mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate

不少資料會讓你直接使用更爲簡單的mvn archetype:generate命令,但在Maven 2中這是不安全的,由於該命令沒有指定Archetype插件的版本,因而Maven會自動去下載最新的版本,進而可能獲得不穩定的SNAPSHOT版本,致使運行失敗。然而在Maven 3中,即便用戶沒有指定版本,Maven也只會解析最新的穩定版本,所以這是安全的。

咱們其實是在運行插件maven-archetype-plugin,注意冒號的分隔,其格式爲groupld:artifactid:version:goalorg.apache.maven.plugins是maven官方插件的groupldmaven-archetype-plugin是Archetype插件的artifactId2.0-alpha-5是日前該插件最新的穩定版generate是要使用的插件目標

3.3 Maven Archetype 生成HelloWorld

執行mvn archetype:generate後,緊接着會看到一段長長的輸出,有不少可用的Archetype供選擇,包括著名的Appfuse項目ArchetypeJPA項目Archetype等。每個Archetype前面都會對應有一個編號,同時命令行會提示一個默認的編號,其對應的Archetypemaven-archetype-quickstart,直接回車以選擇該Archetype:

,緊接着Maven會提示輸入要建立項目的groupId、artifactId、version以及包名package。以下輸入並確認:

Archetype插件將根據咱們提供的信息建立項目骨架。在當前目錄下,Archetype插件會建立一個名爲HelloWorld,即咱們定義的artifactId。從中能夠看到項目的基本結構:

|---HelloWorld

|---pom.xml

|---src

     |---main

     |---java

         |---org.hebut.maven.helloworld

    |---test

     |---java

基本的pom.xml已經被建立,裏面包含了必要的信息以及一個junit依賴主代碼目錄src/main/java已經被建立,在該目錄下還有一個Java類org.hebut.maven.helloworld.App,注意這裏使用到了剛纔定義的包名,而這個類也僅僅只有一個簡單的輸出"Hello World!"的main方法;測試代碼目錄src/test/java也被建立好了,而且包含了一個測試用例org.hebut.maven.helloworld.AppTest

Archetype能夠幫助咱們迅速地構建起項目的骨架,在前面的例子中,咱們徹底能夠在Archetype生成的骨架的基礎上開發Hello World項目以節省大量時間。此外,這裏僅僅是看到了一個最簡單的Archetype,若是有不少項目擁有相似的自定義項目結構以及配置文件,則徹底能夠一勞永逸地開發本身的Archetype。而後在這些項目中使用自定義的Archetype來快速生成項目骨架。

4、m2eclipse簡單使用

前面介紹HelloWorld項目的時候,並無涉及IDE,如此簡單的一個項目,使用最簡單的編輯器也能很快完成。但對於稍微大一些的項目來講,沒有IDE就是不可想象的。那麼,下面將介紹一個目前比較經常使用的一款Maven IDE插件:m2eclipse。m2eclipse是Eclipse中的一款Maven插件,功能比較強大,下面將介紹一下m2eclispe的基本使用。

4.1 導入Maven項目

在上期,介紹瞭如何安裝m2eclipse。如今,使用m2ecilpse導人HelloWorld項目:

步驟一:選擇菜單項File,而後選擇Import,咱們會看到一個Import對話框。在該對話框中選擇Mavenl目錄下的Maven Projects:

步驟二:而後單擊Next按鈕,就會出現Import Projects對話框:

步驟三:在該對話框中,單擊Browse按鈕選擇HelloWorld的根目錄,即包含pom. xml文件的那個目錄

這時對話框中的Projects:部分就會顯示該目錄包含的Maven項目,如上圖所示。

步驟四:單擊Finish按鈕以後,m2ecilpse就會將該項目導人到當前的workspace中

導人完成以後,就能夠在Package Explorer視圖中看上圖所示的項目結構。

從上圖,咱們看到主代碼目錄src/main/java和測試代碼目錄src/test/java成了Eclipse中的資源目錄,包和類的結構也十分清晰。固然pom.xml永遠在項目的根目錄下,而從這個視圖中甚至還能看到項目的依賴junit-3.8.1.jar,其實際的位置指向了Maven本地倉庫。這裏自定義了Maven本地倉庫地址爲F:\Tools\DevelopTool\MavenSource。

4.2 建立Maven項目

建立一個Maven項目也十分簡單,下面簡單介紹一下Maven項目建立方式。

步驟一:選擇菜單項File→New→Other,在彈出的對話框中選擇Maven下的Maven Project:

步驟二:而後單擊Next按鈕,在彈出的New Maven Project對話框中,使用默認的選項,不要選擇Create a simple project選項,那樣咱們就能使用Maven Arche-

type

步驟三:單擊Next按鈕,此時m2eclipse會提示咱們選擇一個Archetype。這裏選擇maven-ar-chetype-quickstart

步驟四:再單擊Next按鈕,因爲m2eclipse其實是在使用maven-archetype-plugin插件建立項目,所以這個步驟與上一節使用archetype建立項目骨架相似,輸入groupld、artifactld、version、package(暫時不考慮Properties)。以下圖所示:

單擊Finish按鈕,Maven項目就建立完成了了,其結構與前一個已導入的HelloWorld項目結構基本一致。

4.3 運行mvn命令

以前,咱們須要在命令行輸入如mvn clean install之類的命令來執行maven構建,m2eclipse中也有對應的功能。在Maven項目或者pom. xml上右擊,再在彈出的快捷菜單中選擇Run As,就能看到常見的Maven命令,以下圖所示:

選擇想要執行的Maven命令就能執行相應的構建,同時也能在Eclipse的console中看到構建輸出。這裏常見的一個問題是,默認選項中沒有咱們想要執行的Maven命令怎麼辦?好比,默認帶有mvn test,但咱們想執行mvn clean test。很簡單,選擇Maven build自定義Maven運行命令,在彈出話框的Goals一項中輸入咱們想要執行的命令,如clean test,設置一下Name,單擊Run便可。而且,下一次咱們選擇Maven build或者使用快捷鍵"Alt+Shift+X,M"快速執行Maven構建的時候,上次的配置直接就能在歷史記錄中找到。

相關文章
相關標籤/搜索