本指南將指導您使用Maven構建一個簡單的Java專案。
你要構建什麼
您將建立一個提供一天中時間的應用程式,然後使用Maven構建它。
你需要什麼
- 大約15分鐘
- 最喜歡的文字編輯器或IDE
- JDK 8或更高版本
如何完成本指南
與大多數Spring入門指南一樣,您可以從頭開始並完成每個步驟,或者您可以繞過您已熟悉的基本設定步驟。無論哪種方式,您最終都會使用工作程式碼。
要從頭開始,請繼續使用Gradle構建。
要跳過基礎知識,請執行以下操作:
- 下載並解壓縮本指南的源儲存庫,或使用Git克隆它:
git clone https://github.com/spring-guides/gs-maven.git
- 進入gs-maven/initial
- 跳到最開始。
完成後,可以根據gs-maven/complete中的程式碼檢查結果。
設定專案
首先,您需要為Maven設定一個Java專案來構建。為了保持對Maven的關注,現在讓專案儘可能簡單。在您選擇的專案資料夾中建立此結構。
建立目錄結構
在您選擇的專案目錄中,建立以下子目錄結構;例如,在*nix系統上使用mkdir -p src/main/java/hello:
└── src
└── main
└── java
└── hello
在src/main/java/hello目錄中,您可以建立所需的任何Java類。為了與本指南的其餘部分保持一致,請建立以下兩個類: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!";
}
}
現在您已經準備好使用Maven構建專案,下一步是安裝Maven。
Maven可以在http://maven.apache.org/download.cgi下載為zip檔案。只需要二進位制檔案,因此請查詢指向apache-maven-{version}-bin.zip或apache-maven-{version}-bin.tar.gz的連結。
下載zip檔案後,將其解壓縮到您的計算機上。然後將bin資料夾新增到路徑中。
要測試Maven安裝,請從命令列執行mvn:
mvn -v
如果一切順利,您應該會看到有關Maven安裝的一些資訊。它看起來類似於(儘管可能略有不同)以下內容:
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。
定義一個簡單的Maven pom
現在已經安裝了Maven,您需要建立一個Maven專案定義。Maven專案使用名為pom.xml的XML檔案定義。除此之外,該檔案還提供了專案在外部庫上的名稱,版本和依賴關係。
在專案的根目錄下建立一個名為pom.xml的檔案(即將其放在src資料夾旁邊),併為其提供以下內容:
<?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>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<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>
除了可選**元素之外,這是構建Java專案所必需的最簡單的pom.xml檔案。它包括專案配置的以下詳細資訊:
- **。POM模型版本(總是4.0.0)。
- **。專案所屬的組或組織。通常表示為反向域名。
- **。要賦予專案庫工件的名稱(例如,其JAR或WAR檔案的名稱)。
- **。正在構建的專案的版本。
- ** – 如何打包專案。對於JAR檔案打包,預設為“jar”。使用“war”進行WAR檔案打包。
在選擇版本控制方案時,Spring建議採用語義版本控制方法。
此時,您已定義了一個最小但功能強大的Maven專案。
構建Java程式碼
Maven現在已準備好構建該專案。您現在可以使用Maven執行多個構建生命週期目標,包括編譯專案程式碼的目標,建立庫包(例如JAR檔案),以及在本地Maven依賴庫中安裝庫。
要嘗試構建,請在命令列中發出以下命令:
mvn compile
這將執行Maven,告訴它執行編譯目標。完成後,您應該在target/classes目錄中找到已編譯的.class檔案。
由於您不太可能希望直接分發或使用.class檔案,因此您可能希望改為執行package:
mvn package
package將編譯Java程式碼,執行任何測試,並通過包裝內的一個JAR檔案中的程式碼終止上升的目標目錄。JAR檔案的名稱將基於專案和。例如,給定之前的最小pom.xml檔案,JAR檔案將命名為gs-maven-0.1.0.jar。
如果您已將“jar” 的值更改為“war”,則結果將是目標目錄中的WAR檔案而不是JAR檔案。
Maven還在本地計算機上維護了一個依賴儲存庫(通常位於主目錄中的.m2/repository目錄中),以便快速訪問專案依賴項。如果您想將專案的JAR檔案安裝到該本地儲存庫,那麼您應該呼叫install目標:
mvn install
install將編譯,測試和打包專案的程式碼,然後將其複製到本地依賴性庫,準備好另一個專案中引用它作為一個依賴。
說到依賴關係,現在是時候在Maven構建中宣告依賴關係了。
宣告依賴關係
簡單的Hello World示例是完全獨立的,不依賴於任何其他庫。但是,大多數應用程式依賴外部庫來處理常見和複雜的功能。
例如,假設除了說“Hello World!”之外,您還希望應用程式列印當前日期和時間。雖然您可以使用本機Java庫中的日期和時間工具,但您可以使用Joda Time庫使事情變得更有趣。
首先,將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類來獲取和列印當前時間。
如果您現在要執行mvn compile以構建專案,則構建將失敗,因為您未在構建中將Joda Time宣告為編譯依賴項。您可以通過將以下行新增到pom.xml(在元素內)來解決此問題:
<dependencies>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
這個XML塊宣告瞭專案的依賴項列表。具體來說,它宣告瞭Joda Time庫的單一依賴項。在元素內,依賴關係座標由三個子元素定義:
- ** – 依賴項所屬的組或組織。
- ** – 所需的庫。
- ** – 所需庫的特定版本。
預設情況下,所有依賴項都作為compile依賴項確定範圍。也就是說,它們應該在編譯時可用(如果您正在構建WAR檔案,包括在WAR的/WEB-INF/libs資料夾中)。此外,您可以指定一個元素以指定以下範圍之一:
- provided – 編譯專案程式碼所需的依賴關係,但是將在執行時由執行程式碼的容器(例如,Java Servlet API)提供。
- test – 用於編譯和執行測試的依賴關係,但不是構建或執行專案的執行時程式碼所必需的依賴關係。
現在,如果您執行mvn compile或mvn package,Maven應該從Maven Central儲存庫解析Joda Time依賴關係,並且構建將成功。
寫一個測試
首先在測試範圍中將JUnit新增為pom.xml的依賴項:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
然後建立一個這樣的測試用例:
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”的外掛來執行單元測試。此外掛的預設配置src/test/java使用名稱匹配編譯並執行所有*Test類。您可以在命令列上執行測試
mvn test
或者只使用mvn install上面已經顯示的步驟(有一個生命週期定義,其中“test”作為“安裝”中的一個階段包含在內)。
這是完成的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>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<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外掛,以簡化JAR檔案的可執行性。本指南的重點是Maven的入門,而不是使用這個特定的外掛。
概要
恭喜!您已經為構建Java專案建立了一個簡單而有效的Maven專案定義。