本指南將引導您使用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項目再沧。
也可以看看
以下指南也可能會有所幫助: