Maven+Java入門程序
本指南將引導您使用Maven構建一個簡單的Java項目。
創建什麼功能?
我們將學習如何創建一個提供時間的應用程序,然後使用Maven構建它。
需要什麼?
- 大約15分鐘的時間
- 最喜歡的文本編輯器或IDE
- JDK8或更高版本
如何完成本指南
像大多數Spring入門教程一樣,可以從頭開始並完成每個步驟,也可以繞過已熟悉的基本設置步驟。無論哪種方式,最後需要編寫代碼。
設置項目
首先,我們需要爲Maven創建一個Java項目。要將重點放在Maven上,並儘可能簡化項目。 在選擇的項目文件夾中創建此結構。
創建目錄結構
在您選擇的項目目錄中,創建以下子目錄結構; 例如,在*nix系統上使用 mkdir -p src/ main/java/hello
(在Windows系統上,請自己創建這個目錄結構,在本示例創建的目錄是:D:\worksp\springws\firstapp
):
└── 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 或 http://mirrors.hust.edu.cn/apache/maven/ 下載爲zip文件。只使用二進制文件,所以請查看apache-maven-{version}-bin.zip
或apache-maven-{version}bin.tar.gz
的鏈接。
下載完壓縮文件後,將其解壓縮到您的計算機上。 然後將bin
文件夾添加到環境變量路徑中。
注意:如果瞭解如何安裝Maven,請參考: https://www.yiibai.com/maven/maven\_environment\_setup.html
要測試Maven安裝,請從命令行運行mvn:
mvn -v
如果一切順利,應該看到一些關於Maven安裝的信息。它看起來類似於(但可能略有不同)以下輸出內容:
C:\Users\Administrator>mvn -v
Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-25T03:49:0
5+08:00)
Maven home: D:\software\apache-maven-3.5.3\bin\..
Java version: 1.8.0_65, vendor: Oracle Corporation
Java home: D:\Program Files\Java\jdk1.8.0_65\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
恭喜! 你現在已經成功地安裝了Maven。
定義一個簡單的Maven構建
既然已經安裝了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>
除了可選的<packaging>
元素外,其它可以省略,這是構建Java項目所需的最簡單的pom.xml
文件。 它包含項目配置的以下詳細信息:
-
<modelVersion>
- POM模型版本(當前使用4.0.0
)。 -
<groupId>
- 該項目所屬的組或組織, 通常使用反向域名錶示。 -
<artifactId>
- 要賦予項目庫工件的名稱(例如,其JAR或WAR文件的名稱)。 -
<version>
- 正在構建的項目版本。 -
<packaging>
- 項目應該如何打包。JAR文件打包默認爲「jar」。 WAR文件打包使用「war」。
到了這裏,您已經定義了一個最小但功能強大的Maven項目。
構建Java代碼
Maven現在已準備好構建該項目。 您現在可以使用Maven執行幾個構建生命週期目標,包括編譯項目代碼的目標,創建庫包(如JAR文件)以及將庫安裝在本地Maven依賴項存儲庫中。
要嘗試構建,請在命令行中輸入以下內容:
mvn compile
這將運行Maven,告訴它執行編譯目標。 完成後,應該在target/classes
目錄中找到已編譯的.class
文件。
由於不想直接分發或處理.class
文件,那麼可運行包目標:
mvn package
包目標將編譯您的Java代碼,並運行測試,並通過將代碼打包到目標目錄中的JAR文件中完成。 JAR文件的名稱將基於項目的<artifactId>
和<version>
。 例如,上面給出的最小pom.xml
文件,JAR文件將被命名爲gs-maven-0.1.0.jar
。
如果您已將<packaging>
的值從「jar」更改爲「war」,則結果將是目標目錄中的WAR文件而不是JAR文件。
Maven還在本地機器上維護一個依賴庫(通常位於主目錄的.m2/repository
目錄中),以便快速訪問項目依賴項。如果想將項目的JAR文件安裝到本地存儲庫,那麼應該調用安裝目標:
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時間庫的一個依賴項。 在<dependency>
元素中,依賴關係座標由三個子元素定義:
-
<groupId>
- 依賴項所屬的組或組織。 -
<artifactId>
- 需要的類庫。 -
<version>
- 需要的庫的特定版本。
默認情況下,所有依賴項的作用範圍都是編譯依賴關係。 也就是說,它們應該在編譯時可用(並且如果正在構建WAR文件,包括WAR中的/WEB-INF/libs
文件夾)。 另外,可以指定一個<scope>
元素來指定下列其中一個範圍:
-
provided
- 編譯項目代碼所需的依賴項,但運行時由運行代碼的容器(例如Java Servlet API)提供。 -
test
- 用於編譯和運行測試的依賴項,但不是構建或運行項目運行時代碼所必需的。
現在,如果運行mvn compile
或mvn包,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安裝步驟,因爲我們已經在上面展示過了(有一個生命週期定義,其中「test」包含在「install」中的一個階段)。
以下是完整的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來開發,不使用特定的插件。
編譯結果如下 -
運行測試結果如下 -
運行輸出結果 -
D:\worksp\springws\firstapp>java -jar target/gs-maven-0.1.0.jar
The current local time is: 09:52:01.046
Hello world!
D:\worksp\springws\firstapp>
可以看到,程序已經輸出當前時間。