本指南將指導(dǎo)你利用Maven構(gòu)建一個簡單的Java項(xiàng)目。
你所構(gòu)建
你將使用Maven來構(gòu)建一個應(yīng)用程序,它將提供一天中的時間斯够。
你所需要
- 大約15min
- 一個你喜歡的代碼編譯器
- JDK6或者更高版本
如何完成本指南
想大多數(shù)的Spring入門指南一樣,你可以從頭開始然后完成每一步,或者你可以繞過已經(jīng)熟悉的基本設(shè)置步驟翻默。無論哪種方法,你都會得到工作代碼澄步。
想從頭開始冰蘑?請移步設(shè)置項(xiàng)目
跳過了基礎(chǔ)設(shè)置?繼續(xù)看以下內(nèi)容:
- 下載并解壓本指南的源儲存庫村缸,或者通過Git clone本指南:
git clone https://github.com/spring-guides/gs-maven.git
- cd 進(jìn)入
gs-maven/initial
- 跳轉(zhuǎn)到初始化
當(dāng)你完成之后祠肥,你可以根據(jù)gs-maven/complete
中的代碼檢驗(yàn)結(jié)果。
設(shè)置項(xiàng)目
首先你需要通過Maven來構(gòu)建一個Java項(xiàng)目,只需要注意Maven仇箱,至于這個項(xiàng)目可以盡量的簡單
創(chuàng)建目錄結(jié)構(gòu)
在你選中的項(xiàng)目目錄中县恕,創(chuàng)建以下子目錄結(jié)構(gòu);例如剂桥,在Unix/Linux系統(tǒng)中使用命令 mkdir -p src/main/java/hello
└── src
└── main
└── java
└── hello
在src/main/java/hello
這個目錄中忠烛,你可以創(chuàng)建任何你想要的Java class文件。為了保持與本指南其余部分的一致权逗,創(chuàng)建以下兩個class文件:HelloWorld.java
美尸、Greeter.java
。
src/main/java/hello/HelloWorld.java
package hello;
public class HelloWorld {
public static void main(String[] args) {
Greeter greeter = new Greeter();
System.out.println(greeter.sayHello());
}
}
src/main/java/hello/Greeter.java
package hello;
public class Greeter {
public String sayHello() {
return "Hello world!";
}
}
至此你已經(jīng)有了一個可以用Maven來構(gòu)造的項(xiàng)目斟薇,接下來就是安裝Maven师坎。
你可以通過http://maven.apache.org/download.cgi下載作為壓縮文件的Maven。只需要二進(jìn)制文件堪滨,所以只需要找到apache-maven-{version}-bin.zip
和apache-maven-{version}-bin.tar.gz
的連接即可胯陋。
下載壓縮文件并解壓它,之后將它bin
文件夾的路徑添加到環(huán)境變量path
中袱箱。
若想測試Maven的安裝情況遏乔,在命令行執(zhí)行以下命令:
mvn - v
如果一切正常,你可以看到一些關(guān)于Maven的安裝信息发笔,例如下面所展示的內(nèi)容(可能有些輕微的區(qū)別):
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 07:51:28-0600)
Maven home: /usr/share/maven
Java version: 1.7.0_09, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.8.3", arch: "x86_64", family: "mac"
恭喜你盟萨!Maven已經(jīng)成功安裝啦!
定義一個簡單的Maven構(gòu)造
Maven已經(jīng)安裝了讨,現(xiàn)在你需要做的就是創(chuàng)建一個Maven項(xiàng)目定義鸯旁。Maven項(xiàng)目有一個名叫pom.xml的XML文件,它將定義整個項(xiàng)目量蕊。除此之外铺罢,它還定義了項(xiàng)目的名稱、版本和對于外部庫的依賴關(guān)系残炮。
在項(xiàng)目的根目錄中創(chuàng)建一個pom.xml韭赘,并給出一下內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-maven</artifactId>
<packaging>jar</packaging>
<version>0.1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>hello.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
除了可選元素<packaging>
,以上就是一個Java項(xiàng)目需要的最簡單的pom.xml文件势就。它包括以下項(xiàng)目配置的細(xì)節(jié):
-
<modelVersion>
泉瞻,POM版本(通常是4.0.0); -
<gropId>
苞冯,本項(xiàng)目屬于哪一個項(xiàng)目組袖牙,通常用它的反轉(zhuǎn)域名作為名稱; -
<artifactId>
舅锄,給與項(xiàng)目artifact的名稱(例如鞭达,那些名字中包含JAR和WAR的文件) -
<version>
,正在構(gòu)造的項(xiàng)目的版本 -
<packaging>
,項(xiàng)目應(yīng)該以哪種形式被打包畴蹭,默認(rèn)用“jar”打包JAR文件坦仍,用“war”打包JAR文件。
當(dāng)談到選擇一個版本控制方案叨襟,Spring推薦使用semantic versioning繁扎。
在這一點(diǎn)上,你已經(jīng)定義了一個最小但是又有能力的Maven項(xiàng)目糊闽!
構(gòu)建Java代碼
Maven現(xiàn)在已經(jīng)準(zhǔn)備好構(gòu)建你的項(xiàng)目了梳玫!你可以使用Maven執(zhí)行幾個構(gòu)建生命周期目標(biāo),其中包括編譯你的項(xiàng)目代碼右犹,創(chuàng)建庫包(如JAR文件 )汽纠,并將庫安裝到本地Maven依賴關(guān)系庫中。
若想嘗試構(gòu)建傀履,請?jiān)诿钚休斎胍韵旅睿?br>
mav compile
它會運(yùn)行Maven,通知Maven運(yùn)行編譯這個功能莉炉。當(dāng)編譯完成钓账,你可以在target/classes目錄中找到那個被編譯的.class文件
由于你不可能直接分發(fā)或使用.class文件,你可能跟你想運(yùn)行包命令:
mvn package
打包命令將編譯你的Java代碼絮宁,運(yùn)行所有的測試用例梆暮,然后把代碼導(dǎo)報成一個JAR文件,放在target文件夾中绍昂。JAR文件的命名基于項(xiàng)目的<artifactId>
和<version>
啦粹。舉個栗子,在前面提到的最基本的pom.xml窘游,它的JAR文件將被命名為gs-maven-0.1.0.jar唠椭。
如果你改變了
<packaging>
中的值,從“jar”變成“war”忍饰,那么結(jié)果將是target中的文件是WAR贪嫂,而不是JAR文件。
為了快速訪問項(xiàng)目的依賴艾蓝,Maven在本機(jī)維護(hù)了一個依賴關(guān)系庫(通常是在.m2/repository這個目錄下)力崇。如果你想安裝項(xiàng)目的JAR文件到本地庫,只需要執(zhí)行install命令
mvn install
這個命令將編譯赢织、測試和打包你項(xiàng)目的代碼亮靴,然后把它拷貝到依賴關(guān)系庫中,為其他項(xiàng)目
同一個依賴參考于置。
說了這么久的依賴茧吊,是時候在Maven構(gòu)建中聲明依賴關(guān)系了。
聲明依賴
Hello World這個簡單的實(shí)示例完全的獨(dú)立的,并不需要依賴其他的外部庫饱狂。但是對于大多數(shù)應(yīng)用來說曹步,都需要依賴外部庫來處理一些常見且復(fù)雜的功能。
舉個栗子休讳,假設(shè)除了say“Hello World讲婚!”,你還想讓這個應(yīng)用打印出當(dāng)前的日期和時間俊柔,雖然你可以使用Java庫中的日期和時間工具筹麸,但如果使用Joda Time庫來操作,會變得非常有趣雏婶。
首先物赶,修改你的Hello World.java文件,就像以下這樣:
src/main/java/hello/HelloWorld.java
package hello;
import org.joda.time.LocalTime;
public class HelloWorld {
public static void main(String[] args) {
LocalTime currentTime = new LocalTime();
System.out.println("The current local time is: " + currentTime);
Greeter greeter = new Greeter();
System.out.println(greeter.sayHello());
}
}
這里的HelloWorld
用了Joda Time的LocalTime
類來獲取當(dāng)前的打印的時間留晚。
如果你現(xiàn)在運(yùn)行mvn compile
來構(gòu)建項(xiàng)目酵紫,這個構(gòu)建必將失敗,其原因是你還沒有將Joda Time聲明成一個編譯依賴错维。你可以通過增加以下的代碼到pom.xml文件(增加到<project>
這個元素里)來修復(fù)這個問題:
<dependencies>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
這個XMl快聲明了項(xiàng)目的依賴關(guān)系列表奖地,具體來說,它為Joda Time庫聲明了一個依賴關(guān)系赋焕。在<dependency>
元素中参歹,依賴坐標(biāo)由三個子元素定義:
-
<groupId>
- 這個依賴關(guān)系屬于什么組織 -
<artifactId>
- 被要求的庫 -
<version>
- 這個庫被要求的具體版本
默認(rèn)的,所有的依賴關(guān)系都作為編譯依賴關(guān)系隆判,意思是犬庇,他們將在編譯時候被利用到(如果你正在構(gòu)造一個WAR文件,包括在WAR的/WEB-INF/libs文件夾中)侨嘀。另外臭挽,你可以指定<scope>
元素來指定以下范圍之一:
-
<provided>
- 編譯項(xiàng)目代碼所需要的依賴關(guān)系,但運(yùn)行時將由運(yùn)行代碼容器提供(例如Java Servlet API) -
<test>
- 依賴關(guān)系在編譯和運(yùn)行測試的時候?qū)⒈挥玫揭螅窃跇?gòu)建或運(yùn)行項(xiàng)目的運(yùn)行代碼不是必需的
那么現(xiàn)在埋哟,如果你再次運(yùn)行mvn compile
或者mvn package
,Maven將從Maven中心庫中解析Joda Time依賴郎汪,然后就構(gòu)建成功了赤赊。
寫一個測試
首先添加一個JUnit依賴到你的pom.xml文件中,作用域?yàn)?code>test:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
接下來創(chuàng)建一個測試用例像以下所示:
src/test/java/hello/GreeterTest.java
package hello;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.*;
import org.junit.Test;
public class GreeterTest {
private Greeter greeter = new Greeter();
@Test
public void greeterSaysHello() {
assertThat(greeter.sayHello(), containsString("Hello"));
}
}
Maven使用一個名叫“surefire”的插件來運(yùn)行單元測試,此插件默認(rèn)配置是編譯并運(yùn)行在src/test/java
中名稱與*Test匹配的類。你可以通過以下的命令行來運(yùn)行這些測試
mvn test
或者用mvn install
忽媒,就像我們在上面已經(jīng)提到過的那樣(有一個生命周期定義爵卒,“test”被包括在“install”階段)。
這里有一個完整的pom.xml
文件:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-maven</artifactId>
<packaging>jar</packaging>
<version>0.1.0</version>
<dependencies>
<!-- tag::joda[] -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
<!-- end::joda[] -->
<!-- tag::junit[] -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- end::junit[] -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>hello.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
這個完整的pom.xml文件使用Maven Shade Plugin來簡化JAR文件的可執(zhí)行性炉媒。本指南專注于開始使用Maven特纤,而不是使用這個插件岁疼。
摘要
恭喜你波俄!你已經(jīng)創(chuàng)造了一個簡單的有用的通過Maven定義并構(gòu)造的Java項(xiàng)目
擴(kuò)展瀏覽
下面的這個指南或許能更好的幫助到你
想要寫一個全新的入門指南或者為現(xiàn)有的入門指南做貢獻(xiàn)么晨逝?點(diǎn)擊貢獻(xiàn)指南!
所有的指南都將發(fā)布ASLv2許可證的代碼懦铺、Attribution還有為寫作頒發(fā)的NoDerivatives creative commons license