使用Maven構建Java專案

qianmoQ發表於2019-01-19

本指南將指導您使用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.javaGreeter.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 compilemvn 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專案定義。

相關文章