# 使用Maven構建Java項目
本指南將引導您逐步使用Maven構建一個簡單的Java項目。
## 你會建立什么
您將創建一個提供一天中時間的應用程序,然后使用Maven進行構建。
## 你需要什么
* 約15分鐘
* 最喜歡的文本編輯器或IDE
* [JDK 8](https://openjdk.java.net/install/) 或更高版本
## 如何完成本指南
像大多數Spring 一樣 [入門指南](https://spring.io/guides) ,您可以從頭開始并完成每個步驟,也可以繞過您已經熟悉的基本設置步驟。 無論哪種方式,您最終都可以使用代碼。
要 **從頭開始** ,請繼續以 [設置項目](https://spring.io/guides/gs/maven/#scratch) 。
要 **跳過基礎知識** ,請執行以下操作:
* [下載](https://github.com/spring-guides/gs-maven/archive/master.zip) 并解壓縮本指南的源存儲庫,或使用 對其進行克隆 [Git](https://spring.io/understanding/Git) : `git clone [https://github.com/spring-guides/gs-maven.git](https://github.com/spring-guides/gs-maven.git)`
* 光盤進入 `gs-maven/initial`
* 跳至 [\[initial\]](https://spring.io/guides/gs/maven/#initial) 。
**完成后** ,您可以根據中的代碼檢查結果 `gs-maven/complete`.
## 設置項目
首先,您需要設置一個Java項目供Maven構建。 為了專注于Maven,現在使該項目盡可能簡單。 在您選擇的項目文件夾中創建此結構。
### 創建目錄結構
在您選擇的項目目錄中,創建以下子目錄結構; 例如, `mkdir -p src/main/java/hello` 在\* nix系統上:
~~~
└── 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可作為zip文件從 下載 [https://maven.apache.org/download.cgi](https://maven.apache.org/download.cgi) 。 僅需要二進制文件,因此請查找指向apache-maven- *{version}* \-bin.zip或apache-maven- *{version}* \-bin.tar.gz的鏈接。
下載zip文件后,將其解壓縮到計算機上。 然后將 添加 *bin* 文件夾 到您的路徑。
要測試Maven安裝,請運行 `mvn` 從命令行:
~~~
mvn -v
~~~
如果一切順利,應該向您提供有關Maven安裝的一些信息。 它看起來將類似于以下內容(盡管可能與以下內容略有不同):
~~~
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00)
Maven home: /home/dsyer/Programs/apache-maven
Java version: 1.8.0_152, vendor: Azul Systems, Inc.
Java home: /home/dsyer/.sdkman/candidates/java/8u152-zulu/jre
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-36-generic", arch: "amd64", family: "unix"
~~~
恭喜你! 您現在已經安裝了Maven。
信息:您可能想考慮使用 [Maven包裝器](https://github.com/takari/maven-wrapper) 來隔離開發人員,使其避免擁有正確版本的Maven或完全安裝它。 從 下載的項目 [Spring Initializr](https://start.spring.io) 都包含包裝器。 它顯示為腳本 `mvnw` 在您運行的項目的頂層 `mvn`.
## 定義一個簡單的Maven構建
現在已經安裝了Maven,您需要創建一個Maven項目定義。 Maven項目是使用名為 的XML文件定義的 *pom.xml* 。 除其他外,該文件提供了項目的名稱,版本以及它對外部庫的依賴關系。
創建一個名為 的文件 *pom.xml* 在項目的根目錄下 (即,將其放在 `src` 文件夾),并提供以下內容:
`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 https://maven.apache.org/xsd/maven-4.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>3.2.4</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>`元素,這是 的最簡單的 *pom.xml* 構建Java項目所需 文件。 它包括以下項目配置的詳細信息:
* `<modelVersion>`。 POM模型版本(始終為4.0.0)。
* `<groupId>`。 項目所屬的組或組織。 通常表示為反向域名。
* `<artifactId>`。 要賦予項目的庫工件的名稱(例如,其JAR或WAR文件的名稱)。
* `<version>`。 正在構建的項目的版本。
* `<packaging>`\-如何打包項目。 對于JAR文件打包,默認為“ jar”。 使用“ war”進行WAR文件打包。
在選擇版本控制方案時,Spring建議使用 語義版本控制 方法。
至此,您已經定義了一個最小但功能強大的Maven項目。
## 建立Java程式碼
Maven現在準備構建該項目。 您現在可以使用Maven執行幾個構建生命周期目標,包括編譯項目代碼,創建庫包(例如JAR文件)以及在本地Maven依賴項存儲庫中安裝庫的目標。
要嘗試構建,請在命令行中發出以下命令:
~~~
mvn compile
~~~
這將運行Maven,告訴它執行 *編譯* 目標。 完成后,您應該 找到已編譯的 *.class* 在 文件 *target / classes* 目錄中 。
由于您不太可能希望直接分發或使用 *.class* 文件,因此您可能需要運行 *程序包* 目標:
~~~
mvn package
~~~
該 *包裝* 目標將編譯Java代碼,運行任何測試,并通過在內部的JAR文件將代碼打包了完成 *目標* 目錄。 JAR文件的名稱將基于項目的 `<artifactId>` 和 `<version>`。 例如,給定之前的最小 *pom.xml* 文件,則JAR文件將命名為 *gs-maven-0.1.0.jar* 。
要執行JAR文件,請運行:
~~~
java -jar target/gs-maven-0.1.0.jar
~~~
如果您更改了 <packaging>從“ jar”到“ war”,結果將是 的WAR文件 目標 目錄中 而不是JAR文件。
Maven還維護本地計算機上的依賴項存儲庫(通常在 中的 *.m2 / repository* 主目錄 目錄中),以快速訪問項目依賴項。 如果要將項目的JAR文件安裝到該本地存儲庫,則應調用 `install` 目標:
~~~
mvn install
~~~
在 *安裝* 目標將編譯,測試和打包項目的代碼,然后將其復制到本地依賴性庫,準備好另一個項目中引用它作為一個依賴。
說到依賴,現在是時候在Maven構建中聲明依賴了。
## 聲明依賴
簡單的Hello World示例是完全獨立的,并且不依賴于任何其他庫。 但是,大多數應用程序都依賴于外部庫來處理常見和復雜的功能。
例如,假設除了說“ Hello World!”外,您還希望應用程序打印當前日期和時間。 雖然可以使用本機Java庫中的日期和時間工具,但可以使用Joda Time庫使事情變得更有趣。
首先,將HelloWorld.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` 類以獲取并顯示當前時間。
如果你要跑步 `mvn compile`要立即構建項目,構建將失敗,因為您尚未在構建中將Joda Time聲明為編譯依賴項。 您可以通過在 添加以下幾行 *pom.xml中* (在 `<project>` 元素):
~~~
<dependencies>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
~~~
XML塊聲明了項目的依賴項列表。 具體來說,它聲明了Joda Time庫的單個依賴關系。 內 `<dependency>` 元素,相關性坐標由三個子元素定義:
* `<groupId>` -依賴關系所屬的組或組織。
* `<artifactId>` -所需的庫。
* `<version>` -所需的特定版本的庫。
默認情況下,所有依賴項的作用域為 `compile`依賴關系。 也就是說,它們應該在編譯時可用(如果您正在構建WAR文件,包括在WAR的 */ WEB-INF / libs* 文件夾中)。 此外,您可以指定一個 `<scope>` 元素以指定以下范圍之一:
* `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` 如我們上面已經顯示的步驟(存在一個生命周期定義,其中“測試”作為“安裝”的一個階段包括在內)。
這是完成的 `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 https://maven.apache.org/xsd/maven-4.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>3.2.4</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,而不是使用此特定插件。
## 概括
恭喜你! 您已經創建了一個簡單而有效的Maven項目定義來構建Java項目。
- springboot概述
- springboot構建restful服務
- spring構建一個RESTful Web服務
- spring定時任務
- 消費RESTful Web服務
- gradle構建項目
- maven構建項目
- springboot使用jdbc
- springboot應用上傳文件
- 使用LDNA驗證用戶
- 使用 spring data redis
- 使用 spring RabbitTemplate消息隊列
- 用no4j訪問nosql數據庫
- springboot驗證web表單
- Spring Boot Actuator構j建服務
- 使用jms傳遞消息
- springboot創建批處理服務
- spring security保護web 安全
- 在Pivotal GemFire中訪問數據
- 使用Spring Integration
- 使用springboot jpa進行數據庫操作
- 數據庫事務操作
- 操作mongodb
- springmvc+tymleaf創建web應用
- 將Spring Boot JAR應用程序轉換為WAR
- 創建異步服務
- spring提交表單
- 使用WebSocket構建交互式Web應用程序
- 使用REST訪問Neo4j數據
- jquery消費restful
- springboot跨域請求
- 消費SOAP Web服務
- springboot使用緩存
- 使用Vaadin創建CRUD UI
- 使用REST訪問JPA數據
- 使用REST訪問Pivotal GemFire中的數據
- 構建soap服務
- 使用rest訪問mongodb數據
- 構建springboot應用docker鏡像
- 從STS部署到Cloud Foundry
- springboot測試web應用
- springboot訪問mysql
- springboot編寫自定義模塊并使用
- 使用Google Cloud Pub / Sub進行消息傳遞
- 構建反應式RESTful Web服務
- 使用Redis主動訪問數據
- Spring Boot 部署到Kubernetes
- 使用反應式協議R2DBC訪問數據
- Spring Security架構
- spring構建Docker鏡像詳解
- Spring Boot和OAuth2
- springboot應用部署到k8s
- spring構建rest服務詳解