# 使用Eclipse建置Maven專案(上) 1. **What is maven** * maven: Apache Turbin 工程師開發的專案建置工具。 * maven是一個應用程式專案建置工具(bulid tool) ,用來幫助開發團隊處理編譯、測試、包裝、管理函式庫、管理設定檔等工作。 * 提供<font color="#f00">標準專案目錄</font>功能,所有maven專案都具備相同目錄結構,幫住程式開法團隊快速了解專案內容。 * 提供<font color="#f00">標準專案建置步驟</font>功能,所有maven專案都用相同步驟建置,讓程式開發團隊使用相同方式(指令)建置專案。 2. maven是Java command-line工具,必須安裝JDK才可以使用,此處不介紹command之maven使用,以下為使用Eclipse工具來建立maven專案步驟。 * eclipse從luna開始內建maven功能,支援所有maven的重要功能 * 產生maven專案:File選單=>New+>Project...=>Maven=>Maven Project * 建置maven專案:Run選單=>Run Configurations...=>畫面左邊=>Maven Bulid * 選擇專案路徑 ![](https://i.imgur.com/BEUq6wd.png) * 普通java程式,maven專案:輸入maven-apache-quickstart 選擇版本 1.4,產生maven專案 ![](https://i.imgur.com/VItIiEm.png) * <font color="#f00">groupld</font>:maven專案id(必須是不重複的id),通常使用Java套件命名慣例(例如:org.iiiedu.samuel)來保證獨特性 * <font color="#f00">artifactId</font>:與version共同組成maven專案JAR檔、或是WAR檔名稱,通常使用小寫字母。 * <font color="#f00">version</font>:與artifactId共同組成maven專案JAR檔、或是WAR檔名稱,可以使用任意字串(例如:1.0、1.1.2、2.3.5.Final等)。 * <font color="#f00">package</font>:maven專案的Java類別預設套件名稱 ![](https://i.imgur.com/GTn9cku.png) 3. Standard Directory Layout * 為了幫助程式開發團隊快速了解專案的各個部分,maven提出<font color="#f00">標準目錄配置(standard directory layout)</font>的概念,由archetype模組產生的所有maven專案都具備<font color="#f00">相同的目錄結構</font>。 * Maven專案第1層目錄:<font color="#f00">主要設定檔(pom.xml)</font>、文件檔(LICENSE.txt、NOTICE.txt、README.txt)、2個子目錄(src、target) * <font color="#f00">target目錄</font>:放置專案建置完成的產出(例如:class檔、war檔) * <font color="#f00">src目錄</font>:放置專案實際內容,各種專案資料分門別類放在不同目錄內,例如:main目錄放置主程式、test目錄放置測試程式。 * src的子目路test、<font color="#f00">main</font>:放置不同目的的程式碼與設定檔。 ![](https://i.imgur.com/yrAqPts.png) ![](https://i.imgur.com/elcyIU8.png) ![](https://i.imgur.com/SbGjqzh.png) ![](https://i.imgur.com/fM0fw5g.png) 4. Project Object Model: pom.xml * maven的所有功能都圍繞著專案建置而設計,主要設定檔pom.xml包含所有專案的建置的詳細資訊。以mavenarchetype-quickstart的pom.xml作為範例: * <project>:pom.xml的root標籤。 * <font color="#f00"><modelVersion>:pom.xml的版本,必要標籤請不要修改預設值。</font> * <groupId>:專案的id。 * <artifactId>:maven最後包裝完成JAR檔、WAR檔的基礎名稱。 * <version>:專案版本名稱。 * <name>:專案名稱,通常出現在maven產生的專案文件內。 * <url>:專案網址,例如:放置專案文件的網址。 * <packaging>:maven專案建置流程中phase與plugin goal的綁定規則,以及maven專案最後包裝的格式(JAR、WAR等)。 * <properties>:設定系統相關properties值,可以讓maven程式使用${propertiesName}語法抓取properties值。 常用於:宣告變數名稱,告訴檔案其他部分來引用此變數名稱 ![](https://i.imgur.com/LlkXrFP.png) * <properties>的<project.bulid.sourceEncoding>子標籤:設定原始程式的檔案編碼,客製化maven-resourcesplugin goal。 * <properties>的<maven.compiler.source>子標籤以及<properties>的<maven.compiler.target>子標籤:設定編譯時使用的JDK版本,客製化maven-compiler-plugin plugin goal。 ![](https://i.imgur.com/Kkp1dor.png) maven中的Java專案及Web專案之設定可參考: https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html * <dependencies>:設定maven專案所需要的函式庫。 * <bulid>:設定(客製化)maven專案建置過程的各種工作。 * <bulid>的<pluginManagement>的<plugins>子標籤:宣告某些plugin的資料,方便maven專案或是子專案使用。 ![](https://i.imgur.com/A4jsB0n.png) 5. 設定maven dependency * denpendency:專案建置過程需要的函式庫,使用主要設定檔pom.xml的<dependencies>以及子標籤<dependency定義> * <font color="#f00">若需要更換library時,透過此標籤即可執行一系列操作(下載、設定、更換library一次完成),換句話說,更換library時,可以透過同一個組態檔設定完成,這是maven中非常方便的功能。</font> ![](https://i.imgur.com/7wELNcs.png) * <dependency>標籤最常用的4個子標籤:<groupId>、<artifactId>、<version>、<scope> * <groupId>、<artifactId>、<version>:對應函式庫專案註冊時使用的groupId、artifactId、version設定值 其中函式庫查詢網址為:https://mvnrepository.com/ https://repo.maven.apache.org/maven2/ https://search.maven.org/ * 其中<scope>:設定maaven會在專案建置過程的哪(幾)個階段(phase)使用宣告的dependency函式庫。 設定值有: ![](https://i.imgur.com/Im2gvQ3.png) * compile(預設值):在專案的編譯、測試、執行階段都需要。 * provided:只在專案的編譯與測試階段需要,到了執行階段會由系統提供,例如由JDK或是container提供。 * runtime:只在專案的測試與執行階段需要、編譯時不需要。 * test:只在專案的測試階段需要。 * system:當在remote repository找不到需要的jar(函式庫)時,需要手動放置該jar檔並設置路徑。<systemPath></systemPath> ![](https://i.imgur.com/K4jMJje.png) 6. maven dependency運作方式 * (1)maven首先從<font color="#f00">local repository</font>尋找需要的函式庫 * maven local repository預設在<使用者目錄>/.m2/repository目錄 * 其中使用者目錄隨作業系統不同而改變,Windows10的使用者目錄預設在C:/Users/<使用者帳號> * (2)無法在local repository找到的函式庫則maven會從<font color="#f00">remote repository</font>搜尋、並下載到local repository讓專案使用。 * 常用JDBC Driver的<dependency>宣告值 ![](https://i.imgur.com/o9q4C9K.png) 7.maven的標準專案建置步驟 * 為了幫助程式開發團隊快速掌握專案的建置流程maven提出<font color="#f00">標轉專案建置步驟</font>的概念,所有maven專案都使用相同步驟建置。 * 標準專案建置步驟分成3個層級:build lifecycle、phase、plugin goal。 * 注意: <font color="#f00">1個build lifecycle由多個phase組成;1個phase可以綁定0個~多個plugin goal。</font> buile lifecycle : maven考量Java應用程式建置的各種流程設計出default、clean與site等3個bulid lifecycle。 * <font color="#f00">default</font>:定義專案建置與發佈的主要流程。 * <font color="#f00">clean</font>:定義清理專案建置產出物以便重新建置的流程。 * <font color="#f00">site</font>:定義產生專案文件、建立專案網站的流程。 phase: phase是builde lifecycle的組成部件,例如default lifecycle由20多個phase組成,函蓋Java應用程式建置過程的所有工作。 由於所有phase名稱都不重複,執行maven專案建置指令的步驟: * 1.根據phase名稱找出所屬的buiild lifecycle * 2.依照順序執行bulid lifecycle的各個phase直到phase名稱為止。 當phase為install時:將包裝完的程式安裝到local repository上讓其他的專案使用。 當phase為deploy時:會將jar檔安裝至local上,再將程式複製到remote repository讓其他專案使用。 eclipse執行畫面: ![](https://i.imgur.com/2SEUEgI.png) plugin goal: * <font color="#f00">phase實際執行的工作通常會隨著專案不同而改變。</font> * plugin goal是phase實際執行的工作,<font color="#f00">再pom.xml使用<packaging>、或<plugin>標籤可以在各個phase綁定不同的plugin goal</font> * 如果phase沒有綁定plugin goal,專案建置時maven會跳過這個phase而不執行。 ![](https://i.imgur.com/8yIOhZK.png)