使用Maven構(gòu)建Java項目

本指南將引導您使用Maven構(gòu)建一個簡單的Java項目。

你會建立什么

您將創(chuàng)建一個提供一天中時間的應用程序嬉橙,然后使用Maven進行構(gòu)建。

你需要什么

約15分鐘

最喜歡的文本編輯器或IDE

JDK 8或更高版本

如何完成本指南

您可以從頭開始并完成每個步驟风范,也可以繞過您已經(jīng)熟悉的基本設(shè)置步驟抵屿。無論哪種方式,您最終都可以使用工作代碼丐重。

設(shè)置項目

首先腔召,您需要設(shè)置一個Java項目供Maven構(gòu)建。為了專注于Maven扮惦,現(xiàn)在使該項目盡可能簡單臀蛛。在您選擇的項目文件夾中創(chuàng)建此結(jié)構(gòu)。

創(chuàng)建目錄結(jié)構(gòu)

在您選擇的項目目錄中,創(chuàng)建以下子目錄結(jié)構(gòu)浊仆;例如客峭,mkdir -p src/main/java/hello在* nix系統(tǒng)上:


src/main/java/hello目錄中,您可以創(chuàng)建所需的任何Java類抡柿。為了與本指南的其余部分保持一致舔琅,請創(chuàng)建以下兩個類:HelloWorld.java和Greeter.java。

src/main/java/hello/HelloWorld.java

package hello;publicclassHelloWorld{publicstaticvoidmain(String[] args){? ? ? ? Greeter greeter =newGreeter();? ? ? ? System.out.println(greeter.sayHello());? ? }}

src/main/java/hello/Greeter.java

packagehello;publicclassGreeter{publicStringsayHello(){return"Hello world!";? ? }}

現(xiàn)在您已經(jīng)準備好使用Maven構(gòu)建項目洲劣,下一步就是安裝Maven搏明。

Maven可作為zip文件從https://maven.apache.org/download.cgi 下載。僅需要二進制文件闪檬,因此請查找指向apache-maven- {version} -bin.zip或apache-maven- {version} -bin.tar.gz的鏈接星著。

下載完zip文件后,將其解壓縮到計算機上粗悯。然后將bin文件夾添加到您的路徑虚循。

要測試Maven安裝,請從命令行運行mvn:

mvn-v

如果一切順利样傍,應該向您提供有關(guān)Maven安裝的一些信息横缔。它看起來與以下內(nèi)容相似(盡管可能略有不同):

Apache Maven3.3.9(bb52d8502b132ec0a5a3f4c09453c07478323dc5;2015-11-10T16:41:47+00:00)Maven home:/home/dsyer/Programs/apache-mavenJava version:1.8.0_152,vendor: Azul Systems, Inc.Java home:/home/dsyer/.sdkman/candidates/java/8u152-zulu/jreDefault locale: en_GB, platform encoding: UTF-8OS name:"linux",version:"4.15.0-36-generic",arch:"amd64",family:"unix"

恭喜你!您現(xiàn)在已經(jīng)安裝了Maven衫哥。

信息:您可能想考慮使用Maven包裝器使開發(fā)人員避免擁有正確版本的Maven或完全安裝它茎刚。從Spring Initializr下載的項目都包含包裝器。它以腳本的形式顯示mvnw在項目的頂層撤逢,代替mvn膛锭。

定義一個簡單的Maven構(gòu)建

現(xiàn)在已經(jīng)安裝了Maven,您需要創(chuàng)建一個Maven項目定義蚊荣。Maven項目是使用名為pom.xml的XML文件定義的初狰。除其他外,該文件提供了項目的名稱互例,版本以及它對外部庫的依賴關(guān)系奢入。

在項目的根目錄下創(chuàng)建一個名為pom.xml的文件(即,將其放在src文件夾旁邊)媳叨,并提供以下內(nèi)容:

pom.xml

.

<?xml version="1.0"encoding="UTF-8"?>4.0.0org.springframeworkgs-mavenjar0.1.01.81.8org.apache.maven.pluginsmaven-shade-plugin2.1packageshadehello.HelloWorld

除可選<packaging>元素外腥光,這是構(gòu)建Java項目所需的最簡單的pom.xml文件。它包括以下項目配置的詳細信息:

<modelVersion>糊秆。POM模型版本(始終為4.0.0)武福。

<groupId>。項目所屬的組或組織扩然。通常表示為反向域名艘儒。

<artifactId>。要賦予項目的庫工件的名稱(例如,其JAR或WAR文件的名稱)界睁。

<version>觉增。正在構(gòu)建的項目的版本。

<packaging>翻斟。如何打包項目逾礁。對于JAR文件打包,默認為“ jar”访惜。使用“ war”進行WAR文件打包嘹履。

至此,您已定義了一個最小但功能強大的Maven項目

構(gòu)建Java代碼

Maven現(xiàn)在準備構(gòu)建項目债热。您現(xiàn)在可以使用Maven執(zhí)行幾個構(gòu)建生命周期目標砾嫉,包括編譯項目代碼,創(chuàng)建庫包(例如JAR文件)并將庫安裝在本地Maven依賴庫中的目標窒篱。

要嘗試構(gòu)建焕刮,請在命令行中發(fā)出以下命令:

mvncompile

這將運行Maven,告訴它執(zhí)行編譯目標墙杯。完成后配并,您應該在target / classes目錄中找到已編譯的.class文件。

由于您不太可能希望直接分發(fā)或使用.class文件高镐,因此您可能需要運行程序包目標:

mvnpackage

該包裝目標將編譯Java代碼溉旋,運行任何測試,并通過在內(nèi)部的JAR文件將代碼打包了完成目標目錄嫉髓。JAR文件的名稱將基于項目的<artifactId>和<version>观腊。例如,給定以前的最小pom.xml文件岩喷,則JAR文件將命名為gs-maven-0.1.0.jar恕沫。

要執(zhí)行JAR文件监憎,請運行:

java-jar target / gs-maven-0.1.0.jar

如果將值<packaging>從“ jar”更改為“ war”纱意,結(jié)果將是目標目錄中的WAR文件而不是JAR文件。

Maven還維護本地計算機上的依賴項存儲庫(通常在主目錄中的.m2 / repository目錄中)鲸阔,以快速訪問項目依賴項偷霉。如果要將項目的JAR文件安裝到該本地存儲庫,則應調(diào)用install目標:

mvninstall

在安裝目標將編譯褐筛,測試和打包項目的代碼类少,然后將其復制到本地依賴性庫,準備好另一個項目中引用它作為一個依賴渔扎。

說到依賴硫狞,現(xiàn)在是時候在Maven構(gòu)建中聲明依賴了。

聲明依賴

簡單的Hello World示例完全是獨立的,并且不依賴于任何其他庫残吩。但是财忽,大多數(shù)應用程序都依賴于外部庫來處理常見和復雜的功能。

例如泣侮,假設(shè)除了說“ Hello World即彪!”外,您還希望應用程序打印當前日期和時間活尊。雖然可以使用本機Java庫中的日期和時間工具隶校,但可以使用Joda Time庫使事情變得更有趣。

首先蛹锰,將HelloWorld.java更改如下:

src/main/java/hello/HelloWorld.java

.

package hello;import org.joda.time.LocalTime;publicclassHelloWorld{publicstaticvoidmain(String[] args){? ? ? ? LocalTime currentTime =newLocalTime();? ? ? ? System.out.println("The current local time is: "+ currentTime);? ? ? ? Greeter greeter =newGreeter();? ? ? ? System.out.println(greeter.sayHello());? ? }}

這里HelloWorld使用Joda Time的LocalTime類來獲取并打印當前時間深胳。

如果您現(xiàn)在要運行mvn compile以構(gòu)建項目,則構(gòu)建將失敗铜犬,因為您尚未在構(gòu)建中將Joda Time聲明為編譯依賴項稠屠。您可以通過將以下行添加到pom.xml(在<project>元素內(nèi))來解決此問題:

joda-timejoda-time2.9.2

XML塊聲明了項目的依賴項列表。具體來說翎苫,它為Joda Time庫聲明了一個依賴關(guān)系权埠。在<dependency>元素內(nèi),依賴關(guān)系坐標由三個子元素定義:

<groupId> -依賴關(guān)系所屬的組或組織煎谍。

<artifactId> -所需的庫攘蔽。

<version> -所需的特定版本的庫。

默認情況下呐粘,所有依賴項的作用域都作為compile依賴項满俗。也就是說,它們應該在編譯時可用(如果您正在構(gòu)建WAR文件作岖,包括在WAR的/ WEB-INF / libs文件夾中)唆垃。此外,您可以指定一個<scope>元素來指??定以下范圍之一:

provided -編譯項目代碼所需的依賴關(guān)系痘儡,但將在運行時由運行代碼的容器(例如Java Servlet API)提供辕万。

test -用于編譯和運行測試的依賴關(guān)系,但對于構(gòu)??建或運行項目的運行時代碼不是必需的沉删。

現(xiàn)在渐尿,如果您運行mvn compile或mvn package,則Maven應該從Maven Central存儲庫中解決Joda Time依賴關(guān)系矾瑰,并且構(gòu)建將成功

編寫測試

首先在測試范圍內(nèi)將JUnit作為對pom.xml的依賴項添加:

junitjunit4.12test

然后創(chuàng)建一個如下的測試用例:

src/test/java/hello/GreeterTest.java

.

packagehello;importstaticorg.hamcrest.CoreMatchers.containsString;importstaticorg.junit.Assert.*;importorg.junit.Test;publicclassGreeterTest{privateGreeter greeter =newGreeter();@TestpublicvoidgreeterSaysHello(){? ? ? ? assertThat(greeter.sayHello(), containsString("Hello"));? ? }}

Maven使用一個名為“ surefire”的插件來運行單元測試砖茸。此插件的默認配置將編譯并運行src/test/java名稱匹配的所有類*Test。您可以像這樣在命令行上運行測試

MVN測試

或只使用mvn install上面已經(jīng)顯示的步驟(有一個生命周期定義殴穴,其中“測試”作為“安裝”的一個階段包含在內(nèi))凉夯。

這是完成的pom.xml文件:

<?xml version="1.0"encoding="UTF-8"?>4.0.0org.springframeworkgs-mavenjar0.1.01.81.8<!-- tag::joda[] -->joda-timejoda-time2.9.2<!-- end::joda[] --><!-- tag::junit[] -->junitjunit4.12test<!-- end::junit[] -->org.apache.maven.pluginsmaven-shade-plugin2.1packageshadehello.HelloWorld

完整的pom.xml文件正在使用Maven Shade插件货葬,以使JAR文件具有可執(zhí)行性。本指南的重點是開始使用Maven劲够,而不是使用此特定插件宝惰。

摘要

恭喜你!您已經(jīng)創(chuàng)建了一個簡單而有效的Maven項目定義來構(gòu)建Java項目再沧。

也可以看看

以下指南也可能會有所幫助:

使用Gradle構(gòu)建Java項目

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尼夺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炒瘸,更是在濱河造成了極大的恐慌淤堵,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顷扩,死亡現(xiàn)場離奇詭異拐邪,居然都是意外死亡,警方通過查閱死者的電腦和手機隘截,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門扎阶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人婶芭,你說我怎么就攤上這事东臀。” “怎么了犀农?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵惰赋,是天一觀的道長。 經(jīng)常有香客問我呵哨,道長赁濒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任孟害,我火速辦了婚禮拒炎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挨务。我一直安慰自己击你,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布耘子。 她就那樣靜靜地躺著果漾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谷誓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天吨凑,我揣著相機與錄音捍歪,去河邊找鬼户辱。 笑死,一個胖子當著我的面吹牛糙臼,可吹牛的內(nèi)容都是我干的庐镐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼变逃,長吁一口氣:“原來是場噩夢啊……” “哼必逆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揽乱,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤名眉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凰棉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损拢,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年撒犀,在試婚紗的時候發(fā)現(xiàn)自己被綠了福压。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡或舞,死狀恐怖荆姆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情映凳,我是刑警寧澤胞枕,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站魏宽,受9級特大地震影響腐泻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜队询,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一派桩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚌斩,春花似錦铆惑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叠聋,卻和暖如春撕阎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碌补。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工虏束, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棉饶,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓镇匀,卻偏偏與公主長得像照藻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汗侵,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容