摘要:在之前,十個項目可能有十種構建方式,但通過,所有項目的構建命令都是簡單一致的。有利于促進項目團隊的標準化。手工勞動往往意味著低效,意味著容易出錯。這在很大程度上消除了重復。默認情況下,該文件夾下放置了本地倉庫。學習實戰許曉斌著
Introduction
Maven是一個異常強大的構建工具,能夠幫我們自動化構建過程,從清理、編譯、測試到生成報告,再到打包和部署。通過Maven,我們只需要輸入簡單的命令(如mvn clean install),就會幫我們處理繁瑣的任務。Maven最大化的消除了構建的重復,抽象了構建生命周期,并且為絕大部分的構建任務提供了已實現的插件。比如說測試,我們只需要遵循Maven的約定編寫好測試用例,當我們運行構建的時候,這些測試便會自動運行。除此之外,Maven能幫助我們標準化構建過程。在Maven之前,十個項目可能有十種構建方式,但通過Maven,所有項目的構建命令都是簡單一致的。有利于促進項目團隊的標準化。
Maven是筆者接觸的第一個脫離于IDE的命令行構建工具,筆者之前一直是基于Visual Studio下進行Windows驅動開發,并不是很能明白Builder與IDE之間的區別。依賴大量的手工操作。編譯、測試、代碼生成等工作都是相互獨立的,很難一鍵完成所有工作。手工勞動往往意味著低效,意味著容易出錯。很難在項目中統一所有的IDE配置,每個人都有自己的喜好。也正是由于這個原因,一個在機器A上可以成功運行的任務,到了機器B的IDE中可能就會失敗。
MakeMake將自己和操作系統綁定在一起了。也就是說,使用Make,就不能實現(至少很難)跨平臺的構建,這對于Java來說是非常不友好的。此外,Makefile的語法也成問題,很多人抱怨Make構建失敗的原因往往是一個難以發現的空格或Tab使用錯誤。
Ant和Make一樣,Ant也都是過程式的,開發者顯式地指定每一個目標,以及完成該目標所需要執行的任務。針對每一個項目,開發者都需要重新編寫這一過程,這里其實隱含著很大的重復。Maven是聲明式的,項目構建過程和過程各個階段所需的工作都由插件實現,并且大部分插件都是現成的,開發者只需要聲明項目的基本元素,Maven就執行內置的、完整的構建過程。這在很大程度上消除了重復。
Ant是沒有依賴管理的,所以很長一段時間Ant用戶都不得不手工管理依賴,這是一個令人頭疼的問題。幸運的是,Ant用戶現在可以借助Ivy管理依賴。而對于Maven用戶來說,依賴管理是理所當然的,Maven不僅內置了依賴管理,更有一個可能擁有全世界最多Java開源軟件包的中央倉庫,Maven用戶無須進行任何配置就可以直接享用。
Usage Installation可從apache官方下載最新的Maven 壓縮包,解壓即可。然后設置下系統的環境變量。如下所示:
M2HOME:maven安裝目錄
Path:追加maven安裝目錄下的bin目錄
在用戶目錄下,我們可以發現.m2文件夾。默認情況下,該文件夾下放置了Maven本地倉庫.m2/repository。所有的Maven構件(artifact)都被存儲到該倉庫中,以方便重用。默認情況下,~/.m2目錄下除了repository倉庫之外就沒有其他目錄和文件了,不過大多數Maven用戶需要復制M2HOME/conf/settings.xml文件到~/.m2/settings.xml
Commands List本節列舉出部分常用的Maven命令:
mvn -v 查看maven版本
mvn compile 編譯
mvn test 測試
mvn package 打包
mvn clean 刪除target
mvn install 安裝jar包到本地倉庫中
創建一個新工程
mvn archetype:generate -DgroupId=co.hoteam -DartifactId=Zigbee -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Pom就像Make的Makefile,Ant的build.xml一樣,Maven項目的核心是pom.xml。
首先創建一個名為hello-world的文件夾,打開該文件夾,新建一個名為pom.xml的文件,輸入其內容如下:
4.0.0 com.juvenxu.mvnbook hello-world 1.0-SNAPSHOT Maven Hello World Project
代碼的第一行是XML頭,指定了該xml文檔的版本和編碼方式。緊接著是project元素,project是所有pom.xml的根元素,它還聲明了一些POM相關的命名空間及xsd元素,雖然這些屬性不是必須的,但使用這些屬性能夠讓第三方工具(如IDE中的XML編輯器)幫助我們快速編輯POM。
根元素下的第一個子元素modelVersion指定了當前POM模型的版本,對于Maven2及Maven 3來說,它只能是4.0.0。這段代碼中最重要的是groupId,artifactId和version三行。這三個元素定義了一個項目基本的坐標,在Maven的世界,任何的jar、pom或者war都是以基于這些基本的坐標進行區分的。
groupId定義了項目屬于哪個組,這個組往往和項目所在的組織或公司存在關聯,譬如你在googlecode上建立了一個名為myapp的項目,那么groupId就應該是com.googlecode.myapp,如果你的公司是mycom,有一個項目為myapp,那么groupId就應該是com.mycom.myapp。本書中所有的代碼都基于groupId com.juvenxu.mvnbook。
artifactId定義了當前Maven項目在組中唯一的ID,我們為這個Hello World項目定義artifactId為hello-world,本書其他章節代碼會被分配其他的artifactId。而在前面的groupId為com.googlecode.myapp的例子中,你可能會為不同的子項目(模塊)分配artifactId,如:myapp-util、myapp-domain、myapp-web等等。
version指定了Hello World項目當前的版本——1.0-SNAPSHOT。SNAPSHOT意為快照,說明該項目還處于開發中,是不穩定的版本。隨著項目的發展,version會不斷更新,如升級為1.0、1.1-SNAPSHOT、1.1、2.0等等。
最后一個name元素聲明了一個對于用戶更為友好的項目名稱,雖然這不是必須的,但我還是推薦為每個POM聲明name,以方便信息交流。 沒有任何實際的Java代碼,我們就能夠定義一個Maven項目的POM,這體現了Maven的一大優點,它能讓項目對象模型最大程度地與實際代碼相獨立,我們可以稱之為解耦,或者正交性,這在很大程度上避免了Java代碼和POM代碼的相互影響。比如當項目需要升級版本時,只需要修改POM,而不需要更改Java代碼;而在POM穩定之后,日常的Java代碼開發工作基本不涉及POM的修改。
Main項目主代碼和測試代碼不同,項目的主代碼會被打包到最終的構件中(比如jar),而測試代碼只在運行測試時用到,不會被打包。默認情況下,Maven假設項目主代碼位于src/main/java目錄,我們遵循Maven的約定,創建該目錄,然后在該目錄下創建文件com/juvenxu/mvnbook/helloworld/HelloWorld.java,其內容如下:
package com.juvenxu.mvnbook.helloworld; public class HelloWorld { public String sayHello() { return "Hello Maven"; } public static void main(String[] args) { System.out.print( new HelloWorld().sayHello() ); } }
關于該Java代碼有兩點需要注意。首先,在95%以上的情況下,我們應該把項目主代碼放到src/main/java/目錄下(遵循Maven的約定),而無須額外的配置,Maven會自動搜尋該目錄找到項目主代碼。其次,該Java類的包名是com.juvenxu.mvnbook.helloworld,這與我們之前在POM中定義的groupId和artifactId相吻合。一般來說,項目中Java類的包都應該基于項目的groupId和artifactId,這樣更加清晰,更加符合邏輯,也方便搜索構件或者Java類。 代碼編寫完畢后,我們使用Maven進行編譯,在項目根目錄下運行命令 mvn clean compile 即可。
clean告訴Maven清理輸出目錄target/,compile告訴Maven編譯項目主代碼,從輸出中我們看到Maven首先執行了clean:clean任務,刪除target/目錄,默認情況下Maven構建的所有輸出都在target/目錄中;接著執行resources:resources任務(未定義項目資源,暫且略過);最后執行compiler:compile任務,將項目主代碼編譯至target/classes目錄(編譯好的類為com/juvenxu/mvnbook/helloworld/HelloWorld.Class)。
Configuration Network Proxy編輯~/.m2/settings.xml文件(如果沒有該文件,則復制$M2HOME/conf/settings.xml)。添加代理配置如下:
Mirror... ... my-proxy true http 代理服務器主機名 端口號
眾所周知的原因,國內有時候并不能夠很順暢的訪問Maven的中央倉庫,往往我們需要訪問國內的鏡像地址:
OSChina Maven教程
Error List 網絡問題CN OSChina Central http://maven.oschina.net/content/groups/public/ central
(1)有時候因為眾所周知的網絡問題,導致Maven無法訪問中央倉庫然后扔出一大堆錯誤,這個時候可以嘗試參考上文中的設置代理。但是也要注意,是不是有一些私庫中的Repository。
編譯問題(1)有時候執行mvn compile時候會爆出無法找到junit的錯誤,可能的解決方法有:
在Eclipse的Projects選項中使用Projects Clean
在pom.xml中引入junit依賴項,并且保證其scope為compile:
junit junit 4.11 test
(2)有時候在Eclipse下執行mvn compile或者相關命令時,會報某某文件出現不識別字符或者非UTF-8編碼,此時可以做幾步檢查:
檢查對應的Java文件是否有Bom頭
檢查對應的Java文件的編碼
如果都沒有問題,在Eclipse中先將文件編碼設置為GBK,再改回UTF-8試試。
ReferenceMaven學習?
Maven實戰(許曉斌著)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64673.html
摘要:如果使用操作系統自帶包安裝,目前安裝的版本是比較舊的。之前版本如果是較低版本的系統,需要先更新內核。然后重復上面的步驟即可。 Quick Start Installation Ubuntu 通過系統自帶包安裝 Ubuntu 14.04 版本系統中已經自帶了 Docker 包,可以直接安裝。 $ sudo apt-get update $ sudo apt-get install -y ...
摘要:是什么是功能強大簡單易用的安全框架,核心功能包括認證授權加密以及管理。的主要作用就是用來執行認證和授權的邏輯,它其實就相當于與安全數據用戶賬號密碼角色權限之間進行交互的橋梁。至此,的三個核心概念已經介紹完畢。 1、Shiro是什么 Shiro是功能強大、簡單易用的Java安全框架,核心功能包括:認證、授權、加密以及Session管理。Shiro的應用范圍很廣泛,小型移動端應用、大型We...
摘要:一軟件資源配置操作系統使用阿里鏡像下載我們將下載下來的系統安裝在虛擬機中。安裝默認安裝路徑例如配置環境變量編輯文件在最下方增加使配置生效驗證執行命令,看到如圖所示代表安裝成功。 本實戰項目,將會從Linux服務器的搭建開始,直到電商項目的基本功能完成。 一、Linux軟件資源配置 1、操作系統 Linux:centos6.8 64bit 使用阿里鏡像下載:https://mirror...
閱讀 3233·2021-11-22 12:07
閱讀 1876·2021-10-12 10:11
閱讀 1041·2019-08-30 15:44
閱讀 2935·2019-08-30 12:45
閱讀 2184·2019-08-29 16:41
閱讀 1636·2019-08-29 16:35
閱讀 2620·2019-08-29 12:57
閱讀 1147·2019-08-26 13:51