1. 程式人生 > >maven實戰(一)簡單mvn構建專案詳解

maven實戰(一)簡單mvn構建專案詳解

建立簡單工程

**mvn archetype:generate 
-DgroupId=org.sonatype.mavenbook.ch03 
-DartifactId=simple 
-DpackageName=org.sonatype.mavenbook**

archetype:create 在maven 3.0.5中已經捨棄,使用generate替代

相關mvn命令

archetype:generate:archetype被定義為“一個原始的模型或者型別,在它之後其它類似的東西與之匹配;一個*原型(prototype)”,Maven有許多可用的archetype,從生成一個簡單的Swing應用,到一個複雜的Web應用。本章我們用最基本的archetype來建立一個入門專案的骨架。這個外掛的字首是“archetype”,目標為“generate”。
-Dname=value

:使用 -D 屬性這樣的形式 1 ,類似於你通過命令列向Java虛擬機器傳遞系統屬性,例如-DgroupId是給groupId設定值,-DartifactId是給artifactId設定值。
執行以上mvn命令後已經生成了一個專案,看一下Maven在simple目錄下建立的目錄結構:
simple/
simple/pom.xml
simple/src
src/main
src/main/java/
simple/target

簡單構建

mvn install:

想要構建打包這個應用,在包含 pom.xml 的目錄下執行mvn install,會下載專案中所有依賴,並在target目錄下生成所有編譯後的檔案,產生一個jar包(預設打包方式是jar包)。

mvn help:effective-pom:

當Maven執行的時候,它是根據專案的 pom.xml 裡設定的組合來執行的,一個最上級的POM定義了Maven的安裝目錄,在這個目錄中全域性的預設值被定義了,(可能)還有一些使用者定義的設定。想要看這個“有效的(effective)”POM,或者說Maven真正執行根據的POM。在目標專案的基礎目錄(pom同級目錄)下跑下面的命令,可以看到當前專案最詳細的maven配置檔案。

maven核心概念

1.Maven外掛和目標 (Plugins and Goals)

Archetype外掛create 目標。Maven第二次執行是一個生命週期階段– install 。為了執行單個的Maven外掛目標,我們使用mvn archetype:create這樣的語法,這裡 archetype 是一個外掛標識create 目標標識。當Maven執行一個外掛目標,它向標準輸出打印出外掛標識和目標標識。

Maven外掛(Plugins):一個Maven外掛是一個單個或者多個目標的集合

Maven外掛的例子有一些簡單但核心的外掛,像Jar外掛,它包含了一組建立JAR檔案的目標,Compiler外掛,它包含了一組編譯原始碼和測試程式碼的目標,或者Surefire外掛,它包含一組執行單元測試和生成測試報告的目標。而其它的,更有專門的外掛包括:Hibernate3外掛,用來整合流行的持久化框架Hibernate,JRuby外掛,它讓你能夠讓執行ruby稱為Maven構建的一部分或者用Ruby來編寫Maven外掛。Maven也提供了自定義外掛的能力。一個定製的外掛可以用Java編寫,或者用一些其它的語言如Ant,Groovy,beanshell和之前提到的Ruby。

目標(Goals):一個目標是一個明確的任務

一個目標是一個明確的任務,它可以作為單獨的目標執行,或者作為一個大的構建的一部分和其它目標一起執行。一個目標是Maven中的一個“工作單元(unit of work)”。目標的例子包括Compiler外掛中的 compile 目標,它用來編譯專案中的所有原始檔,或者Surefire外掛中的 test 目標,用來執行單元測試。目標通過配置屬性進行配置,以用來定製行為
注意:當提到一個外掛目標的時候,我們常常用速記符號: pluginId:goalId 。例如,當提到Archetype外掛的create目標的時候,我們寫成 archetype:create 。
目標定義了一些引數,這些引數可以定義一些明智的預設值。在 archetype:create 這個例子中,我們並沒有在命令列中指定這個目標建立什麼型別的archetype,我們簡單的傳入一個 groupId 和一個 artifactId 。這是我們對於約定優於配置(convention overconfiguration)的第一筆。這裡 create 目標的約定,或者預設值,是建立一個簡單的項
目,叫做Quickstart。 create 目標定義了一個配置屬性archetypeArtifactId ,它有一個預設值為 maven-archetype-quickstart 。Quickstart archetype生成了一個最小專案的軀殼,包括一個POM和一個類。Archetype外掛比第一個例子中的樣子強大得多,但是這是一個快速開始新專案的不錯的方法。在本書的後面,我們將會讓你看到Archetype外掛可以用來生成複雜如web應用的專案,以及你如何能夠使用Archetype外掛來定義你自己專案的集合。
Maven的核心對你專案構建中特定的任務幾乎毫無所知。就它本身來說,Maven不知道如何編譯你的程式碼,它甚至不知道如何製作一個JAR檔案,它把所有這些任務代理給了Maven外掛,像Compiler外掛和Jar外掛,它們在需要的時候被下載下來並且定時的從Maven中央倉庫更新。當你下載Maven的時候,你得到的是一個包含了基本軀殼的Maven核心,它知道如何解析命令列,管理classpath,解析POM檔案,在需要的時候下載Maven外掛。通過保持Compiler外掛和Maven核心分離,並且提供更新機制,使用者很容易能使用編譯器最新的版本。通過這種方式,Maven外掛提供了通用構建邏輯的全域性重用性,有不會在構建週期中定義編譯任務,有使用了所有Maven使用者共享的Compiler外掛。

2.maven生命週期 (Lifecycle)

生命週期是包含在一個專案構建中的一系列有序階段

maven支援許多不同的生命週期,但是最常用的生命週期是預設的Maven生命週期,這個生命週期中一開始的一個階段是驗證專案的基本完整性,最後的一個階段是把一個專案釋出成產品。生命週期的階段被特地留得含糊,單獨的定義為驗證(validation),測試(testing),或者釋出(deployment),而他們對不同專案來說意味著不同的事情例如,打包(package)這個階段在一個專案裡生成一個JAR,它也就意味著“將一個專案打成一個jar”,而在另外一個專案裡,打包這個階段可能生成一個WAR檔案。

生命週期圖

這裡寫圖片描述
這個生命週期能讓開發人員從一個Maven專案跳到另外一個Maven專案,而不用知道太多每個專案構建的細節。如果你能夠構建一個Maven專案,那麼你就能構建所有的Maven專案。
生命週期將會有文來詳細闡述,此處暫略過。

3.Maven座標 (Coordinates)

一個專案的 groupId:artifactId:version 使之成為一個獨一無二的專案

(1)maven座標構成:

Archetype外掛通過名字為 pom.xml 的檔案建立了一個專案。這就是專案物件模型(POM),一個專案的宣告性描述。當Maven執行一個目標的時候,每個目標都會訪問定義在專案POM裡的資訊。當 jar:jar 目標需要建立一個JAR檔案的時候,它通過觀察POM來找出這個Jar檔案的名字。當 compiler:compile 任務編譯Java原始碼為位元組碼的時候,它通過觀察POM來看是否有編譯目標的引數。目標在POM的上下文中執行。目標是我們希望針對專案執行的動作,而專案是通過POM定義的。POM為專案命名,提供了專案的一組唯一識別符號(座標),並且通過依賴(dependencies) ,父 (parents) 和先決條件(prerequisite) 來定義和其它專案的關係。POM也可以自定義外掛行為,提供專案相關的社群和開發人員的資訊。
Maven座標定義了一組標識,它們可以用來唯一標識一個專案,一個依賴,或者MavenPOM裡的一個外掛。

(2)maven座標用處:maven中的專案可以通過座標使用特定構件的依賴

在其它“Maven化”專案構成的巨大空間中,的這四個元素是定位和使用某個特定專案的關鍵因素。Maven倉庫(repositories)(公共的,私有的,和本地的)是通過這些識別符號來組織的當一個專案被安裝到本地的Maven倉庫,它立刻能被任何其它的專案所使用。而我們所需要做的只是,在其它專案用使用Maven的唯一座標來加入對這個特定構件的依賴

4.Maven倉庫(Repositories)

maven公有中央倉庫

當你第一次執行Maven的時候,你會注意到Maven從一個遠端的Maven倉庫下載了許多檔案。如果這個簡單的專案是你第一次執行Maven,那麼當觸發resources:resource目標的時候,它首先會做的事情是去下載最新版本的Resources外掛。在Maven中,構件和外掛是在它們被需要的時候從遠端的倉庫取來的。初始的Maven下載包的大小相當的小(1.8兆),其中一個原因是事實上這個初始Maven不包括很多外掛。它只包含了幾近赤裸的最少值,而在需要的時候再從遠端倉庫去取。Maven自帶了一個用來下載Maven核心外掛和依賴的遠端倉庫地址(http://repo1.maven.org/maven2)。

maven定製倉庫

專案依賴於一些既不免費也不公開的包。在這種情況下,你需要要麼在你組織的網路裡安裝一個定製的倉庫,要麼手動的安裝這些依賴。預設的遠端倉庫可以被替換,或者增加一個你組織維護的自定義Maven倉庫的引用。有許多現成的專案允許組織管理和維護公共Maven倉庫的映象。

maven本地倉庫

mvn install專案的構件安裝到你的本地倉庫

Maven從遠端倉庫下載構件和外掛到你本機上,儲存在你的本地Maven倉庫裡。一旦Maven已經從遠端倉庫下載了一個構件,它將永遠不需要再下載一次,因為maven會首先在本地倉庫查詢外掛,然後才是其它地方。在Windows XP上,你的本地倉庫很可能在 C:\Documents and Settings\USERNAME.m2\repository ,在Windows Vista上,會是 C:\Users\USERNAME.m2\repository 。在Unix系統上,你的本地倉庫在 ~/.m2/repository 。
當你建立像前一節建立的簡單專案時, install 階段執行一個目標,把你專案的構件安裝到你的本地倉庫。在你的本地倉庫,你應該可以看到我們的簡單專案創建出來的構件。

5.Maven依賴管理 (Dependency Management)

(1)傳遞性依賴(transitive dependencies)

一個複雜的專案將會包含很多依賴,也有可能包含依賴於其它構件的依賴。這是Maven最強大的特徵之一,它支援了傳遞性依賴(transitive dependencies)。假如你的專案依賴於一個庫,而這個庫又依賴於五個或者十個其它的庫(就像Spring或者Hibernate那樣)。你不必找出所有這些依賴然後把它們寫在你的 pom.xml 裡,你只需要加上你直接依賴的那些庫,Maven會隱式的把這些庫間接依賴的庫也加入到你的專案中。Maven也會處理這些依賴中的衝突,同時能讓你自定義預設行為,或者排除一些特定的傳遞性依賴。
當你把專案的構件安裝到本地倉庫時,你會發現在和JAR檔案同一目錄下,Maven釋出了一個稍微修改過的 pom.xml 的版本。儲存POM檔案在倉庫裡提供給其它專案了該專案的資訊,其中最重要的就是它有哪些依賴。如果專案B依賴於專案A,那麼它也依賴於專案A的依賴。當Maven通過一組Maven座標來處理依賴構件的時候,它也會獲取POM,通依賴的POM來尋找傳遞性依賴。那些傳遞性依賴就會被新增到當前專案的依賴列表中。在Maven中一個依賴不僅僅是一個JAR。它是一個POM檔案,這個POM可能也聲明瞭對其它構件的依賴。這些依賴的依賴叫做傳遞性依賴,Maven倉庫不僅僅存貯二進位制檔案,也儲存了這些構建的元資料(metadata),才使傳遞性依賴成為可能。

依賴範圍(dependency scope)

Simple專案的 pom.xml 包含了一個依賴—— junit:junit:jar:3.8.1 ——範圍是 test 。當一個依賴的範圍是 test 的時候,說明它在Compiler外掛執行 compile 目標的時候是不可用的。它只有在執行compiler:testCompile 和 surefire:test 目標的時候才會被加入到classpath中。

scope

compile:預設值,適用於所有階段,會隨著專案一起釋出
provided:類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。
runtime:重點內容,只在執行時**使用,如JDBC驅動,適用執行和測試階段。
test:重點內容,只在測試時使用,用於編譯和執行測試程式碼不會隨專案釋出
system,類似provided,需要顯式提供包含依賴的jarMaven不會在Repository中查詢它。

相關推薦

maven實戰簡單mvn構建專案

建立簡單工程: **mvn archetype:generate -DgroupId=org.sonatype.mavenbook.ch03 -DartifactId=simple -DpackageName=org.sonatype.mavenbook

django實戰簡單部落格顯示

一直想好好學習一下Python,正好Django是一個很好的網站開發框架,可以用來web程式。接下來,以一個部落格為例。 一、建立基本框架:(django1.0+python3.6+pycharm) (1)建立專案 控制檯輸入以下命令:

OpenCV實戰——簡單的車牌識別

    前言:        最近一直在學習影象處理,想著找個實踐的例子,這樣讓自己學習起來更加有激情,於是就找了車牌識別的例子,並把它寫下來當作學習總結吧。       近年來,汽車車牌識別(License Plate Recognition)已經越來越受到人們的重視。特別

jvm學習之記憶體模型區域

1,引言     在記憶體管理區域java與c、c++語言不同的是jvm負責管理記憶體控制和垃圾回收的功能,而c、c++程式設計師需要程式碼裡面管理記憶體,這樣雖然方便了java的開發,但出現記憶體溢位和洩漏等問題也不好排查,讓我們先了解下虛擬機器記憶體模型。

Java多執行緒 —— 執行緒的狀態

一、多執行緒概述  1、 程序 是一個正在執行的程式。是程式在計算機上的一次執行活動。 每一個程序執行都有一個執行順序。該順序是一個執行路徑,或者叫一個控制單元。 系統以程序為基本單位進行系統資源的排程和分配。程式要執行,系統就在記憶體中為該程式分配一塊獨立的記憶體空間,載入程式程式碼和資源進行執行。 程式

Nginx模組Lua-Nginx-Module學習筆記Nginx Lua API 介面

value = ngx.HTTP_CONTINUE (100) (first added in the v0.9.20 release) value = ngx.HTTP_SWITCHING_PROTOCOLS (101) (first added in the v0.9.20 release)

【.NET執行緒--進階】--執行緒方法

        上篇部落格從執行緒的基本概況開始著重討論了執行緒,程序,程式之間的區別,然後討論了執行緒操作的幾個類,並通過例項來說明了執行緒的建立方法。本篇部落格將會帶大家更深入的瞭解執行緒,介紹執行緒的基本方法,並通過一個Demo使用委託來呼叫執行緒之外的物件。

Mavenpom.xml配置檔案

setting.xml主要用於配置maven的執行環境等一系列通用的屬性,是全域性級別的配置檔案;而pom.xml主要描述了專案的maven座標,依賴關係,開發者需要遵循的規則,缺陷管理系統,組織和licenses,以及其他所有的專案相關因素,是專案級別的配置檔案。

Maven入門實戰——MVN的安裝、配置、生命週期、簡單入門例項和建立父/子工程

1 Maven簡介  Maven是Apache旗下的一個開源專案,是純Java開發的一個專案管理工具,並且只是用來管理Java專案的。 1.1 Maven的好處  1)Maven專案佔用容量小 同樣的一個專案,如果是用Maven構建的話,專案的大小要小得多。(這是由於Ma

Maven實戰構建簡單Maven專案

上一節講了maven的安裝和配置,這一節我們來學習一下建立一個簡單的Maven專案 1. 用Maven 命令建立一個簡單的Maven專案 在cmd中執行如下命令:   mvn archetype:generate -DgroupId=com.mycompany.ap

Maven系列從零開始構建Java應用程序

.so 構建java項目 cti maven生命周期 包含 兩個類 簡述 work pil 前段時間面試,面試官要我簡述一下Maven生命周期,what?Maven不就是用來構建一個項目的麽,生命周期是什麽東東(我之前一直做.net,但是想找關於java的工作,之前使用Ma

OpenAI Gym 入門與提高 Gym環境構建與最簡單的RL agent

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

簡單爬蟲項目實戰

int htm val target 組類型 resp inf 內容 爬蟲 概述   最近自己想搞一個小的項目,這個項目我們就先從爬蟲開始,爬取直播吧的NBA滾動新聞,再存入數據庫。先寫個簡單點的,後期再不斷的優化下。 準備   直播吧對於喜歡看球的朋友肯定不陌生,http

簡單爬蟲專案實戰

概述   最近自己想搞一個小的專案,這個專案我們就先從爬蟲開始,爬取直播吧的NBA滾動新聞,再存入資料庫。先寫個簡單點的,後期再不斷的優化下。 準備   直播吧對於喜歡看球的朋友肯定不陌生,https://www.zhibo8.cc/,開啟我們看到如下介面, 我們選擇NBA新聞tab,然後選擇滾動

專案管理和構建】——Maven簡介

       在現實的企業中,以低成本、高效率、高質量的完成專案,不僅僅需要技術大牛,企業更加需要管理大牛,管理者只懂技術是遠遠不夠的。當然,管理可以說有很多的方面,例如:對人員的管理,也有對專案的管

Django在OS X下的程式設計實戰構建一個部落格系統

廢話少說,直奔主題,你要做事之前需要有一臺電腦,最好是Linux或者OS X,因為我在Macbook pro下工作,所以至少這裡的命令都在OS X下執行通過的。所有程式碼都是單獨一行方便你拷貝。Python程式碼會有>>>的提示,除此之前,沒有特別提示都是

Spring4 Spring MVC實戰——讀《Spring in action》搭建最簡單的MVC

現在還在用Struts嗎,是的,不說你在用Spring MVC,我都覺得不好意思了。前面的時候所謂的MVC模式中,C的角色交由Struts控制。而Spring MVC這樣叫了,字眼上大概知道這東西是幹什麼用的。之前是在哪裡看到有位大哥這樣說的。技術差別大,一個一個追逐下來很累

Spring 事務配置實戰:過濾無需事務處理的查詢之類操作

log pla ssi pan spl tail gif aop img <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes

maven入門5使用eclipse構建maven項目

org 菜單欄 ini tag 界面 java 我們 core comm 1. 安裝m2eclipse插件 要用Eclipse構建Maven項目,我們需要先安裝meeclipse插件 點擊eclipse菜單欄Help->Eclipse Marketplac

《Netty權威指南》簡單的時間服務器P69

通過 adc 不一致 nios pie bound trap 記錄 esp 由於該書是基於Netty5編寫的樣例代碼,而Netty5已經被官方廢棄。目前基於推薦版的4.1.12.Final在學習過程中,可能會出現個別接口不一致的情況。所以記錄可在4.1.12下編譯通過的代碼