1. 程式人生 > >Maven 使用介紹

Maven 使用介紹

建立project

先去官方網站下載一個最新版本http://maven.apache.org/download.cgi. 下載後解壓,使用之前最好先將maven的bin目錄設定到path環境變數裡面。

maven無非也就是用來build一個project的,直接先上一個例子,在命令列下輸入下面的命令:

mvn archetype:generate DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=myapp

mvn就是maven的命令列程式,archetype:generate中的archetype是plugin的名字,generate是goal的名字,命令列後面的是一些引數。關於archetype和goal以及後面的引數,後面再細說。

如果是第一次執行,這個過程會有點慢,maven需要下載一些依賴項,中間如果有輸入提示資訊,直接回車使用預設值就可以了。這條命令執行完後,會在你的當前目錄下生成一個名為myapp的目錄:

image

注意這個目錄結構,src/main/java 和 src/test/java 是不能改動,不然maven會無法找到原始檔。下面是maven一個標準的目錄結構:

src/main/java Application/Library sources
src/main/resources Application/Library resources
src/main/filters Resource filter files
src/main/assembly
Assembly descriptors
src/main/config Configuration files
src/main/scripts Application/Library scripts
src/main/webapp Web application sources
src/test/java Test sources
src/test/resources Test resources
src/test/filters Test resource filter files
src/site Site

另外maven還生成了一個重要的檔案pom.xml,maven就是通過這個檔案來來管理整個project,可以理解位類似於eclipse的.project檔案。預設生成的pom.xml檔案的內容如下:

/* 1-1 */ 
<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>
	<version>1.1.0.1</version>
	<packaging>jar</packaging>
	<name>myapp</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>

解釋一下這個xml檔案的內容:

  • modelVersion: 這個XML檔案所使用的POM格式的版本
  • groupId: 相當於這個project的所有者或者機構的一個標識,一般是com.company.xxx這種格式
  • artifactId:  這個project最後所生成的文件(jar、war)的名字,比如對於junit這個開源的project,它的artifactId就是junit
  • packaging: 這個project的打包的型別,一般是war、jar等值
  • version: project的版本
  • name: project的名字,生成文件等內容的時候會用的這個名字

這個project建立好後和普通的project沒有什麼不同,我們直接往裡面放原始碼進行開發就可以了,如果有目錄想修改的也完全可以。

POM & archetype

archetype就是一個project的模板,上面我們生成的project就是用預設的archetype生成的。如果使用不同的archetype,生成的project結構會有所不同。 一個archetype指明瞭

  • 1) 專案的目錄結構以及什麼目錄是放source code,哪些是放test source code,哪些目錄是放resource的。
  • 2) 一個預設的pom.xml檔案,這個預設的pom.xml檔案中的groupId,artifactId,version用佔位符表示,在建立project的時候通過引數傳進來。

pom.xml檔案的POM全稱是Project Object Model,這個檔案對於maven的使用者來說是一個和maven互動的渠道,pom.xml包含了一個maven project的配置,一個project該如何編譯打包,project有哪些依賴項等等。

仔細看一下我們前面建立project的命令:mvn archetype:generate DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=myapp

  1. 1) archetype:generate, 這是一個maven的plugin,用來從一個archetype建立一個project,關於plugin後面再說。
  2. 2) DarchetypeGroupId,這個就是指的archetype的groupid,也就是說是用的哪個archetype,或者說用哪個專案模板。
  3. 3) 後面的兩個引數,用來放大pom.xml檔案裡面,作為當前建立的project的描述資訊。

Project建立好了,看如何去編譯,直接進入的project的目錄,在命令列下:

mvn compile

編譯完後maven會建立一個target目錄去儲存編譯結果。 我們需要編譯成一個什麼樣的內容,以及要輸出到什麼地方等等,都是可以在pom.xml檔案裡面配置的,但是因為我們目前並沒有指定這些內容,所以maven會使用預設值。

我們還可以用maven執行test:

mvn test

第一次執行時,maven會去下載一些依賴項。另外要注意的時,如果我們更改了預設的目錄結構,maven會因為找bu到test而無法去執行test。如果只需要編譯test可以執行:

mvn test-compile

要把專案打包,執行:

mvn package

mvn會根據pom.xml裡面的packaging選項打包成相應的檔案。

repository & dependency

maven裡面有一個repository的概念,當我們的專案依賴於某個jar時,maven會去repository裡面去找。repository分兩種,一種是遠端的,一種是本地的。如果有幾個project都用到junit,我們可以把junit放在repository裡面,幾個project可以公用,節約儲存空間而且方便管理,這個repository的位置可以在pom.xml裡面設定。

本地的預設的路徑是安裝使用者的目錄下的 .m2\repository 資料夾。如果一個依賴項在本地的repository裡面沒有,那麼maven會去他自己的遠端的repositoryhttp://repo.maven.apache.org/maven2 去下載後放到本地的repository裡面。

也就是說,我們如果我們的project需要要引用一個依賴項,我們只需要在pom.xml檔案中進行配置,maven會自動幫我們去引用。 我們之前的建立project裡面需要寫單元測試,引用到了junit,看pom中的配置:

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>3.8.1</version>
		<scope>test</scope>
	</dependency>
</dependencies>

每一個需要為每一個 dependency 指明groupId,artifactId,version。scope很簡單,意思是說我們需要怎麼引用,比如我們上面的例子裡面設定的是test,意思是說只在test裡面引用junit。 但是我們如何知道groupId,artifactId和version呢? 比如我現在想引用log4j,這個幾個值怎麼填? 可以去http://mirrors.ibiblio.org/maven2/ 上去查詢。比如log4j,我們就在上面這個地址加上log4j,也就是http://mirrors.ibiblio.org/maven2/junit/。進去後會有一個maven-metadata.xml,開啟就可以知道這些值瞭然後新增這個dependency了。

如果要把一個project安裝到本地的repository裡面,可以執行下面的命令:

mvn install

到這裡就說完了建立,編譯,測試,打包以及安裝,大部分的專案也就是做這些事情。

再介紹幾個其它命令:

  1. mvn site : 為你的project建立一個站點
  2. mvn clean: 清除target目錄下的所有檔案
  3. mvn eclipse:eclipse :為project生成eclipse的工程檔案和classpath檔案

build lifecycle & build phase & goal

maven有一套build的生命週期,是按照一套順序走下來的,這一套順序就叫一個生命週期(lifecycle)。maven內建三種生命週期:default, clean 和 site。一個生命週期分為多個build phase,下面是default生命週期全部的build phase:

  • validatevalidate the project is correct and all necessary information is available.
  • initializeinitialize build state, e.g. set properties or create directories.
  • generate-sourcesgenerate any source code for inclusion in compilation.
  • process-sourcesprocess the source code, for example to filter any values.
  • generate-resourcesgenerate resources for inclusion in the package.
  • process-resourcescopy and process the resources into the destination directory, ready for packaging.
  • compilecompile the source code of the project.
  • process-classespost-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
  • generate-test-sourcesgenerate any test source code for inclusion in compilation.
  • process-test-sourcesprocess the test source code, for example to filter any values.
  • generate-test-resourcescreate resources for testing.
  • process-test-resourcescopy and process the resources into the test destination directory.
  • test-compilecompile the test source code into the test destination directory
  • process-test-classespost-process the generated files from test compilation, for example to do bytecode enhancement on Java classes. For Maven 2.0.5 and above.
  • testrun tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed.
  • prepare-packageperform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package. (Maven 2.1 and above)
  • packagetake the compiled code and package it in its distributable format, such as a JAR.
  • pre-integration-testperform actions required before integration tests are executed. This may involve things such as setting up the required environment.
  • integration-testprocess and deploy the package if necessary into an environment where integration tests can be run.
  • post-integration-testperform actions required after integration tests have been executed. This may including cleaning up the environment.
  • verifyrun any checks to verify the package is valid and meets quality criteria.
  • installinstall the package into the local repository, for use as a dependency in other projects locally.
  • deploydone in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

這些build phase是按照順序執行的,如果執行後面的build phase,前面的build phase 也會被執行。例如如果執行:

mvn deploy

前面的install、verify一直到validate這些build phase都會執行。

每一個build phase是由goal組成的,一個goal其實就是一個任務,一個goal可以關聯到一個build phase也可以不關聯到任何build phase 。 不關聯到任何phase的goal是可以獨立執行的,例如:

mvn clean dependency:copy-dependencies package

上面的命令會導致先執行clean這個phase,然後拷貝依賴項,最後打包。注意,這裡clean這個goal是clean這個lifecycle裡面的一個goal,所以可以看到不同lifecycle的build phase和goal是可以混合在一起執行的。 如果一個goal被繫結到多個phase上,那麼goal就會被執行多次。

phase的順序是已經固定的,如果一個phase沒有繫結到任何goal,那麼phase就不會被執行。 一個goal可以通過兩種方式繫結到一個phase,一個是指定packaging,另一個就是plugin。

packaging&plugin

plugin就是用來向maven提供goal的。一個plugin裡面可以有多個goal,這就是為什麼我們在指明goal時,前面會用一個冒號與plugin的名字。

一個plugin自己可以指定自己的goal繫結到哪個lifecycle的哪一個Phase上,另外也可以配置一個goal繫結到哪個phase上。可以在pom.xml裡面配置。 看兩個配置:

<plugin>
   <groupId>org.codehaus.modello</groupId>
   <artifactId>modello-maven-plugin</artifactId>
   <version>1.4</version>
   <executions>
     <execution>
       <configuration>
         <models>
           <model>src/main/mdo/maven.mdo</model>
         </models>
         <version>4.0.0</version>
       </configuration>
       <goals>
         <goal>java</goal>
       </goals>
     </execution>
   </executions>
 </plugin>

這個就在當前的lifecycle裡面添加了一個名字叫java的goal,這goal會根據自己的配置去繫結到一個phase,在phase執行的時候這個goal會執行。並且在這個配置裡面,可以指定多個execution來讓這個goal執行多次。

看另一個示例配置:

<plugin>
   <groupId>com.mycompany.example</groupId>
   <artifactId>display-maven-plugin</artifactId>
   <version>1.0</version>
   <executions>
     <execution>
       <phase>process-test-resources</phase>
       <goals>
         <goal>time</goal>
       </goals>
     </execution>
   </executions>
 </plugin>

這個名為time的goal把自己繫結到了process-test-resource這個phase上。

在預設情況下,並不是所有的phase都綁定了goal,比如clean這個lifecycle是有三個phase的,但是隻有其中的一個名為clean的phase預設綁定了一個clean:clean goal,其它兩個phase預設沒有繫結任何goal。

之前已經提到過packaging,在pom.xml可以指定packaging,每種packaging都設定了一組phase和goal之間的繫結關係。在default lifecycle下,當packaging為 ejb/ejb3/jar/par/rar/war 其中之一的值的時候,只有以下的phase綁定了goal,具體如下:

process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar
install install:install
deploy deploy:deploy

總結

首先搞清楚maven的project的目錄結構,然後理解maven的lifecycle,lifecycle是由build phase組成,每一個build phase會繫結到goal。goal是由plugin提供的。 每一種packaging的值都表明了一定的phase和goal之間的繫結關係。

另外一個很重要的就是dependency,我們要在專案中引用一個依賴,只需要在pom.xml指定依賴的名字和版本,maven會自動去遠端的repository下載,然後放到本地的repository裡面,這樣以後所有的project都可以共用

相關推薦

Maven介紹及安裝

hang 技術分享 window 重點 pac ack 系統 use 介紹 1.maven是一個管理第三方庫的jar package 2.從該頁面下載相應的Maven jar包(http://maven.apache.org/download.cgi),linux OS

Mave實戰(1)——Maven介紹

java應用 工具 blog 許可 管理系統 使用 1.2 方式 原本 [TOC] 1. Maven介紹 1.1. 何為Maven Maven是一個跨平臺的項目管理工具。 Maven主要服務於基於Java平臺的項目構建、依賴管理和項目信息管理。 1.1.1. Maven是優

maven介紹及私服搭建

file 需求 緩存 項目 start epo -- 打開 for 1.Maven介紹Maven是款平臺的項目管理工具。主要服務於基於java平臺的項目構建,依賴管理和項目信息管理。2.Maven私服搭建環境介紹: 系統:Centos 7.4 64位、Jdk:1.8、mav

maven介紹(作用,核心概念,用法,常用命令,擴張及配置)

maven介紹(作用,核心概念,用法,常用命令,擴張及配置) maven作用,核心概念(pom,repositories,artifact,build lifecycle,goal),用法(archetype意義及建立各種專案),maven常用引數和命令以及簡單故障排除 1、maven的作用 &

maven介紹以及idea中maven的使用

    Maven 除了以程式構建能力為特色之外,還提供高階專案管理工具。由於 Maven 的預設構建規則有較高的可重用性,所以常常用兩三行 Maven 構建指令碼就可以構建簡單的專案。由於 Maven 的面向專案的方法,許多 Apache Jakarta 專案發文時使用 Maven,而且

Maven介紹】專案搭建

Maven介紹 maven是一個工具。管理專案、構建、發表專案的工具。 1.管理依賴 什麼叫依賴?比如你想用JSONObject物件,你的專案依賴於fast json。 pom.xml 可以管理依賴,它會自動幫我們匯入到我們的專案裡,所以會更方便 2.一鍵

1、maven介紹

學習目標: 1、瞭解Maven的歷史 2、瞭解Maven的作用 3、瞭解Maven的基本命令 學習過程: 一、maven介紹 Apache Maven是一個管理和理解軟體專案的一個工具,是基於專案物件模型(POM:project object model),Maven 可以管

Maven介紹_轉載

作用範圍 好處 文件夾 修改 軟件項目 ima 編程 eat 9.png       我記得在搞懂maven之前看了幾次重復的maven的教學視頻。不知道是自己悟性太低還是怎麽滴,就是搞不清楚,現在弄清楚了,基本上入門了。寫該篇博文,就是為了幫助那些和我一樣對於ma

Maven介紹_轉載 maven(一) maven到底是個啥玩意~

maven(一) maven到底是個啥玩意~         我記得在搞懂maven之前看了幾次重複的maven的教學視訊。不知道是自己悟性太低還是怎麼滴,就是搞不清楚,現在弄清楚了,基本上入門了。寫該篇博文,就是為了幫助那些和我一樣對於maven迷迷糊糊的人。有福了,看完基

Maven介紹以及Maven安裝與環境變數配置

Preface     Maven 是一個專案管理和整合工具。Maven為開發者提供了一套完整的構建生命週期框架。開發團隊幾乎不用花多少時間就能夠自動完成工程的基礎構建配置,因為Maven使用了一個

Apache Maven 介紹

陳科肇 ================ 1.什麼是Maven 2.Maven的約定配置 3.基於Maven外掛的全域性性重用 4.一個“專案”的概念模型 ======================

Maven介紹及環境搭建及阿里雲映象倉庫使用

首先Maven是基於專案物件模型(POM),可以通過描述資訊來管理專案的構建、升級、報告和文件軟體專案的管理工具。 1、Maven下載:http://maven.apache.org/ 2、將下載a

maven介紹及常用命令

1、maven的用途   maven是主要服務基於java平臺的專案構建,依賴管理和專案資訊管理的一個工具。專案構建包括清理,編譯,測試到生成測試報告,再到打包和部署;依賴管理是maven藉助於座標來實現的。maven是跨平臺的,可以在windows,linu

maven 介紹

1、maven是個構建工具同時也是個專案管理工具。 像ant一樣預處理,編譯,打包、測試和分發。 maven是一個專案管理工具,因為它提供了一個專案物件模型,一組標誌集合,一個專案生命週期,一個依賴管理系統,執行定義的生命週期外掛。其原則是“預定優於配置” 2、maven

Apache Maven 入門——maven介紹和用maven命令建立專案

maven是什麼 Maven是跨平臺的專案管理工具。主要服務於基於Java平臺的專案自動構建,依賴管理和專案資訊管理。 對於程式設計師來說,最關心的是它的專案自動構建功能和依賴管理的功能。 下載和配置 下載 使用 maven 前,先安裝 JDK 。 M

maven 主要介紹以及 javaee 中構建一詞的概念

maven javaee構建 1、maven 的主要介紹: maven 是 Apache 軟件基金會組織維護的一款自動化構建工具,專註服務於 java 平臺的項目構建和依賴管理。 其功能主要為了應付在實際開發的過程中遇到的下列的問題: a、如果項目非常龐大,就不適合繼續使用packa

maven插件介紹maven-jar-plugin

content letter post end version class pid 技術交流 cut maven-jar-plugin 插件的maven依賴為: <dependency> <groupId>org.apache.maven

圖文介紹MyEclipse (2015) 中創建簡單的Maven項目的步驟(用於生成可運行jar文件)

oca nload org nts -c web html ini sel 利用MyEclipse的引導,能夠非常方便的創建簡單的、用於生成可運行jar文件的Maven項目: (原創文章,轉載請註明轉自Clement-Xu的博客:http://blog.c

常用Maven插件介紹

很好 context 搜索引擎 變量 希望 繼承 索引 archetype 本地倉庫 我們都知道Maven本質上是一個插件框架,它的核心並不執行任何具體的構建任務,所有 這些任務都交給插件來完成,例如編譯源代碼是由maven- compiler-plugin完成的。進一步

Maven詳解(三)------ Maven工程目錄介紹

詳細講解 com tid pom.xml imp 工程目錄 在哪裏 根據 cat   上一章我們配置並安裝好了 Maven,那麽這一章我們介紹如何用eclipse創建一個 Maven 工程,然後介紹 Maven 工程的目錄結構。 1、eclipse 創建 Maven 工程