日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Apache Maven 入门篇

發(fā)布時間:2025/3/21 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Apache Maven 入门篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:George Ma

寫這個 maven 的入門篇是因?yàn)橹霸谝粋€開發(fā)者會的動手實(shí)驗(yàn)中發(fā)現(xiàn)挺多人對于 maven 不是那么了解,所以就有了這個想法。
這個入門篇分上下兩篇。本文著重動手,用 maven 來構(gòu)建運(yùn)行 hellow world 程序,體會一下不用任何 IDE ,只用 maven 是咋回事。然后下篇就講解一下 maven 的核心概念。寫這兩篇文章特意回避了復(fù)雜的示例,也不使用 IDE ,目的是排除干擾,著重于 maven 本身。

本文的源代碼可從這里下載。??

Apache Maven 是做什么用的?


Maven 是一個項(xiàng)目管理和構(gòu)建自動化工具。但是對于我們程序員來說,我們最關(guān)心的是它的項(xiàng)目構(gòu)建功能。所以這里我們介紹的就是怎樣用 maven 來滿足我們項(xiàng)目的日常需要。
Maven 使用慣例優(yōu)于配置的原則 。它要求在沒有定制之前,所有的項(xiàng)目都有如下的結(jié)構(gòu):
?

目錄

目的

${basedir}

存放?pom.xml和所有的子目錄

${basedir}/src/main/java

項(xiàng)目的?java源代碼

${basedir}/src/main/resources

項(xiàng)目的資源,比如說?property文件

${basedir}/src/test/java

項(xiàng)目的測試類,比如說?JUnit代碼

${basedir}/src/test/resources

測試使用的資源

?

一個 maven 項(xiàng)目在默認(rèn)情況下會產(chǎn)生 JAR 文件,另外 ,編譯后 的 classes 會放在 ${basedir}/target/classes 下面, JAR 文件會放在 ${basedir}/target 下面。
這時有人會說了 , Ant 就沒有那么多要求 ,它允許你可以自由的定義項(xiàng)目的結(jié)構(gòu)。在這里不想引起口水戰(zhàn)哈, 我個人覺得 maven 的這些默認(rèn)定義很方便使用。?
好了 ,接下來我們來安裝 maven 。

?

Maven 的安裝

?

在安裝 maven 前,先保證你安裝了 JDK 。 JDK 6 可以從 Oracle 技術(shù)網(wǎng)上下載:
http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html。
Maven 官網(wǎng)的下載鏈接是 :?http://maven.apache.org/download.html?。
該頁的最后給出了安裝指南。


安裝完成后,在命令行運(yùn)行下面的命令:??

? ?

$ mvn -v?
Apache Maven 3.0.3 (r1075438; 2011-03-01 01:31:09+0800)
Maven home: /home/limin/bin/maven3
Java version: 1.6.0_24, vendor: Sun Microsystems Inc.
Java home: /home/limin/bin/jdk1.6.0_24/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.35-28-generic-pae", arch: "i386", family: "unix"


如果你看到類似上面的輸出的話,就說明安裝成功了。
接下來我們用 maven 來建立最著名的“Hello World!”程序 :)
注意:如果你是第一次運(yùn)行 maven,你需要 Internet 連接,因?yàn)?maven 需要從網(wǎng)上下載需要的插件。
我們要做的第一步是建立一個 maven 項(xiàng)目。在 maven 中,我們是執(zhí)行 maven 目標(biāo) (goal) 來做事情的。
maven 目標(biāo)和 ant 的 target 差不多。在命令行中執(zhí)行下面的命令來建立我們的 hello world 項(xiàng)目

??~$mvn archetype:generate -DgroupId=com.mycompany.helloworld -DartifactId=helloworld -Dpackage=com.mycompany.helloworld -Dversion=1.0-SNAPSHOT


archetype:generate 目標(biāo)會列出一系列的 archetype 讓你選擇。 Archetype 可以理解成項(xiàng)目的模型。 Maven 為我們提供了很多種的項(xiàng)目模型,包括從簡單的 Swing 到復(fù)雜的 Web 應(yīng)用。我們選擇默認(rèn)的 maven-archetype-quickstart ,是編號 #106 ,如下圖所示:

?

?

?連打兩個回車,這時候讓你確定項(xiàng)目屬性的配置,

?

??

這些屬性是我們在命令行中用 -D 選項(xiàng)指定的。該選項(xiàng)使用 -Dname=value 的格式。回車確認(rèn),就完成了項(xiàng)目的建立,如下圖所示:

?

??

這時候我們看一下 maven 給我們建立的文件目錄結(jié)構(gòu):



maven 的 archetype 插件建立了一個 helloworld 目錄,這個名字來自 artifactId 。在這個目錄下面,有一個 Project Object Model(POM) 文件 pom.xml 。這個文件用于描述項(xiàng)目,配置插件和管理依賴關(guān)系。
源代碼和資源文件放在 src/main 下面,而測試代碼和資源放在 src/test 下面。

Maven 已經(jīng)為我們建立了一個 App.java 文件:

???

Java代碼

package?com.mycompany.helloworld;?????/**???*?Hello?world!???*???*/???public?class?App?{?????????public?static?void?main(?String[]?args?)?{???????????System.out.println(?"Hello?World!"?);???????}???}??

?

?正是我們需要的 Hello World 代碼。所以我們可以構(gòu)建和運(yùn)行這個程序了。用下面簡單的命令構(gòu)建:

~$cd helloworld

~$mvn package?

當(dāng)你第一次運(yùn)行 maven 的時候,它會從網(wǎng)上的 maven 庫 (repository) 下載需要的程序,存放在你電腦的本地庫 (local repository) 中,所以這個時候你需要有 Internet 連接。Maven 默認(rèn)的本地庫是 ~/.m2/repository/ ,在 Windows 下是 %USER_HOME%\.m2\repository\ 。

?

?如果構(gòu)建沒有錯誤的話,就會得到類似下面的結(jié)果:

?

?

?這個時候, maven 在 helloworld 下面建立了一個新的目錄 target/ ,構(gòu)建打包后的 jar 文件 helloworld-1.0-SNAPSHOT.jar 就存放在這個目錄下。編譯后的 class 文件放在 target/classes/ 目錄下面,測試 class 文件放在 target/test-classes/ 目錄下面。

?為了驗(yàn)證我們的程序能運(yùn)行,執(zhí)行下面的命令:

?~$java -cp target/helloworld-1.0-SNAPSHOT.jar com.mycompany.helloworld.App

?

?
運(yùn)行成功!!

?
現(xiàn)在你可能會有不少的問題。所以下一篇文章會解釋 maven 的核心概念,希望能回答你可能會有的一些疑問。


概的介紹了一下Apache Maven以及它的下載和安裝,并且運(yùn)行了一個簡單的示例。那么在對maven有了一點(diǎn)接觸后,接下去的一步是要了解maven的核心概念,這樣才能在使用maven的時候游刃有余。

接下來我們介紹下面這幾個核心概念:

  • POM (Project Object Model)
  • Maven 插件
  • Maven 生命周期
  • Maven 依賴管理
  • Maven 庫

POM (Project Object Model)


一個項(xiàng)目所有的配置都放置在 POM 文件中:定義項(xiàng)目的類型、名字,管理依賴關(guān)系,定制插件的行為等等。比如說,你可以配置 compiler 插件讓它使用 java 1.5 來編譯。

現(xiàn)在看一下第一篇文章中示例的 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>com.mycompany.helloworld</groupId>?
???? <artifactId>helloworld</artifactId>?
???? <version>1.0-SNAPSHOT</version>?
???? <packaging>jar</packaging>?

???? <name>helloworld</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> ? ?

?

在 POM 中,groupId, artifactId, packaging, version 叫作 maven 坐標(biāo),它能唯一的確定一個項(xiàng)目。有了 maven 坐標(biāo),我們就可以用它來指定我們的項(xiàng)目所依賴的其他項(xiàng)目,插件,或者父項(xiàng)目。一般 maven 坐標(biāo)寫成如下的格式:

???? groupId:artifactId:packaging:version

像我們的例子就會寫成:

???? com.mycompany.helloworld: helloworld: jar: 1.0-SNAPSHOT

我們的 helloworld 示例很簡單,但是大項(xiàng)目一般會分成幾個子項(xiàng)目。在這種情況下,每個子項(xiàng)目就會有自己的 POM 文件,然后它們會有一個共同的父項(xiàng)目。這樣只要構(gòu)建父項(xiàng)目就能夠構(gòu)建所有的子項(xiàng)目了。子項(xiàng)目的 POM 會繼承父項(xiàng)目的 POM。另外,所有的 POM都繼承了一個 Super-POM。Super-POM 設(shè)置了一些默認(rèn)值,比如在第一篇文章中提到的默認(rèn)的目錄結(jié)構(gòu),默認(rèn)的插件等等,它遵循了慣例優(yōu)于配置的原則。所以盡管我們的這個 POM 很簡單,但是這只是你看得見的一部分。運(yùn)行時候的 POM 要復(fù)雜的多。 如果你想看到運(yùn)行時候的 POM 的全部內(nèi)容的話,可以運(yùn)行下面的命令:

$mvn help:effective-pom

Maven 插件


在第一篇文章中,我們用了 mvn archetype:generate 命令來生成一個項(xiàng)目。那么這里的 archetype:generate 是什么意思呢?archetype 是一個插件的名字,generate是目標(biāo)(goal)的名字。這個命令的意思是告訴 maven 執(zhí)行 archetype 插件的 generate 目標(biāo)。插件目標(biāo)通常會寫成?pluginId:goalId

一個目標(biāo)是一個工作單元,而插件則是一個或者多個目標(biāo)的集合。比如說Jar插件,Compiler插件,Surefire插件等。從看名字就能知道,Jar 插件包含建立Jar文件的目標(biāo), Compiler 插件包含編譯源代碼和單元測試代碼的目標(biāo)。Surefire 插件的話,則是運(yùn)行單元測試。

看到這里,估計你能明白了,mvn 本身不會做太多的事情,它不知道怎么樣編譯或者怎么樣打包。它把構(gòu)建的任務(wù)交給插件去做。插件定義了常用的構(gòu)建邏輯,能夠被重復(fù)利用。這樣做的好處是,一旦插件有了更新,那么所有的 maven 用戶都能得到更新。

Maven 生命周期


在上一篇文章中,我們用的第二個命令是:mvn package。這里的 package 是一個maven的生命周期階段 (lifecycle phase )。生命周期指項(xiàng)目的構(gòu)建過程,它包含了一系列的有序的階段 (phase),而一個階段就是構(gòu)建過程中的一個步驟。

那么生命周期階段和上面說的插件目標(biāo)之間是什么關(guān)系呢?插件目標(biāo)可以綁定到生命周期階段上。一個生命周期階段可以綁定多個插件目標(biāo)。當(dāng) maven 在構(gòu)建過程中逐步的通過每個階段時,會執(zhí)行該階段所有的插件目標(biāo)。

maven 能支持不同的生命周期,但是最常用的是默認(rèn)的Maven生命周期 (default Maven lifecycle )。如果你沒有對它進(jìn)行任何的插件配置或者定制的話,那么上面的命令 mvn package 會依次執(zhí)行默認(rèn)生命周期中直到包括 package 階段前的所有階段的插件目標(biāo):

  • process-resources 階段:resources:resources

  • compile 階段:compiler:compile

  • process-classes 階段:(默認(rèn)無目標(biāo))

  • process-test-resources 階段:resources:testResources

  • test-compile 階段:compiler:testCompile

  • test 階段:surefire:test

  • prepare-package 階段:(默認(rèn)無目標(biāo))

  • package 階段:jar:jar
    ?

  • Maven 依賴管理


    之前我們說過,maven 坐標(biāo)能夠確定一個項(xiàng)目。換句話說,我們可以用它來解決依賴關(guān)系。在 POM 中,依賴關(guān)系是在 dependencies 部分中定義的。在上面的 POM 例子中,我們用 dependencies 定義了對于 junit 的依賴:

    Xml 代碼

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

    那這個例子很簡單,但是實(shí)際開發(fā)中我們會有復(fù)雜得多的依賴關(guān)系,因?yàn)楸灰蕾嚨?jar 文件會有自己的依賴關(guān)系。那么我們是不是需要把那些間接依賴的 jar 文件也都定義在POM中呢?答案是不需要,因?yàn)?maven 提供了傳遞依賴的特性。

    所謂傳遞依賴是指 maven 會檢查被依賴的 jar 文件,把它的依賴關(guān)系納入最終解決的依賴關(guān)系鏈中。針對上面的 junit 依賴關(guān)系,如果你看一下 maven 的本地庫(我們馬上會解釋 maven 庫)~/.m2/repository/junit/junit/3.8.1/ ,

    你會發(fā)現(xiàn) maven 不但下載了 junit-3.8.1.jar,還下載了它的 POM 文件。這樣 maven 就能檢查 junit 的依賴關(guān)系,把它所需要的依賴也包括進(jìn)來。

    在 POM 的 dependencies 部分中,scope 決定了依賴關(guān)系的適用范圍。我們的例子中 junit 的 scope 是 test,那么它只會在執(zhí)行 compiler:testCompile and surefire:test 目標(biāo)的時候才會被加到 classpath 中,在執(zhí)行 compiler:compile 目標(biāo)時是拿不到 junit 的。

    我們還可以指定 scope 為 provided,意思是 JDK 或者容器會提供所需的jar文件。比如說在做web應(yīng)用開發(fā)的時候,我們在編譯的時候需要 servlet API jar 文件,但是在打包的時候不需要把這個 jar 文件打在 WAR 中,因?yàn)閟ervlet容器或者應(yīng)用服務(wù)器會提供的。

    scope 的默認(rèn)值是 compile,即任何時候都會被包含在 classpath 中,在打包的時候也會被包括進(jìn)去。
    ?

    Maven?庫


    當(dāng)?shù)谝淮芜\(yùn)行 maven 命令的時候,你需要 Internet 連接,因?yàn)樗獜木W(wǎng)上下載一些文件。那么它從哪里下載呢?它是從 maven 默認(rèn)的遠(yuǎn)程庫(http://repo1.maven.org/maven2) 下載的。這個遠(yuǎn)程庫有 maven 的核心插件和可供下載的 jar 文件。

    但是不是所有的 jar 文件都是可以從默認(rèn)的遠(yuǎn)程庫下載的,比如說我們自己開發(fā)的項(xiàng)目。這個時候,有兩個選擇:要么在公司內(nèi)部設(shè)置定制庫,要么手動下載和安裝所需的jar文件到本地庫。

    本地庫是指 maven 下載了插件或者 jar 文件后存放在本地機(jī)器上的拷貝。在 Linux 上,它的位置在 ~/.m2/repository,在 Windows XP 上,在 C:\Documents and Settings\username\.m2\repository ,在 Windows 7 上,在 C:\Users\username\.m2\repository。當(dāng) maven 查找需要的 jar 文件時,它會先在本地庫中尋找,只有在找不到的情況下,才會去遠(yuǎn)程庫中找。

    運(yùn)行下面的命令能把我們的 helloworld 項(xiàng)目安裝到本地庫:

    ???? $mvn install

    一旦一個項(xiàng)目被安裝到了本地庫后,你別的項(xiàng)目就可以通過 maven 坐標(biāo)和這個項(xiàng)目建立依賴關(guān)系。比如如果我現(xiàn)在有一個新項(xiàng)目需要用到 helloworld,那么在運(yùn)行了上面的 mvn install 命令后,我就可以如下所示來建立依賴關(guān)系:

    Xml 代碼

    ????<dependency><groupId>com.mycompany.helloworld</groupId><artifactId>helloworld</artifactId><version>1.0-SNAPSHOT</version></dependency>

    好了,maven 的核心概念就簡單的介紹到這里。至于在 Eclipse 中如何使用 maven,這個網(wǎng)上很多了,google 一下就行。


    from:?http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-1-406235-zhs.html

    http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-2-405568-zhs.html

    總結(jié)

    以上是生活随笔為你收集整理的Apache Maven 入门篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。