鍍金池/ 教程/ Java/ Maven+Java入門程序
Spring編寫客戶端
Spring編寫服務器
Spring WS靜態(tài)WSDL
Spring WS簡介
Spring Web Services教程
Spring客戶端(單元測試)
Spring服務器(單元測試)
Spring WS入門程序
Maven+Java入門程序

Maven+Java入門程序

本指南將引導您使用Maven構(gòu)建一個簡單的Java項目。

創(chuàng)建什么功能?

我們將學習如何創(chuàng)建一個提供時間的應用程序,然后使用Maven構(gòu)建它。

需要什么?

  • 大約15分鐘的時間
  • 最喜歡的文本編輯器或IDE
  • JDK8或更高版本

如何完成本指南

像大多數(shù)Spring入門教程一樣,可以從頭開始并完成每個步驟,也可以繞過已熟悉的基本設(shè)置步驟。無論哪種方式,最后需要編寫代碼。

設(shè)置項目

首先,我們需要為Maven創(chuàng)建一個Java項目。要將重點放在Maven上,并盡可能簡化項目。 在選擇的項目文件夾中創(chuàng)建此結(jié)構(gòu)。

創(chuàng)建目錄結(jié)構(gòu)

在您選擇的項目目錄中,創(chuàng)建以下子目錄結(jié)構(gòu); 例如,在*nix系統(tǒng)上使用 mkdir -p src/ main/java/hello(在Windows系統(tǒng)上,請自己創(chuàng)建這個目錄結(jié)構(gòu),在本示例創(chuàng)建的目錄是:D:\worksp\springws\firstapp):

└── src
    └── main
        └── java
            └── hello

src/main/java/hello目錄中,可以創(chuàng)建任何想要的Java類。 但是要與本教程的其余部分保持一致,請創(chuàng)建這兩個類: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!";
    }
}

既然已經(jīng)準備好使用Maven構(gòu)建項目,那么下一步就是安裝Maven。

Maven可以在 http://maven.apache.org/download.cgihttp://mirrors.hust.edu.cn/apache/maven/ 下載為zip文件。只使用二進制文件,所以請查看apache-maven-{version}-bin.zipapache-maven-{version}bin.tar.gz的鏈接。

下載完壓縮文件后,將其解壓縮到您的計算機上。 然后將bin文件夾添加到環(huán)境變量路徑中。

注意:如果了解如何安裝Maven,請參考: https://www.yiibai.com/maven/maven_environment_setup.html

要測試Maven安裝,請從命令行運行mvn:

mvn -v

如果一切順利,應該看到一些關(guān)于Maven安裝的信息。它看起來類似于(但可能略有不同)以下輸出內(nèi)容:

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"

恭喜! 你現(xiàn)在已經(jīng)成功地安裝了Maven。

定義一個簡單的Maven構(gòu)建

既然已經(jīng)安裝了Maven,需要創(chuàng)建一個Maven項目定義。 Maven項目使用名為pom.xml的XML文件進行定義。 除此之外,該文件還提供項目的名稱,版本和它在外部庫上的依賴關(guān)系。

在項目的根目錄下創(chuàng)建一個名為pom.xml的文件(即將其放在src文件夾同級)并為其提供以下內(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>

    <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>元素外,其它可以省略,這是構(gòu)建Java項目所需的最簡單的pom.xml文件。 它包含項目配置的以下詳細信息:

  • <modelVersion> - POM模型版本(當前使用4.0.0)。
  • <groupId> - 該項目所屬的組或組織, 通常使用反向域名表示。
  • <artifactId> - 要賦予項目庫工件的名稱(例如,其JAR或WAR文件的名稱)。
  • <version> - 正在構(gòu)建的項目版本。
  • <packaging> - 項目應該如何打包。JAR文件打包默認為“jar”。 WAR文件打包使用“war”。

到了這里,您已經(jīng)定義了一個最小但功能強大的Maven項目。

構(gòu)建Java代碼

Maven現(xiàn)在已準備好構(gòu)建該項目。 您現(xiàn)在可以使用Maven執(zhí)行幾個構(gòu)建生命周期目標,包括編譯項目代碼的目標,創(chuàng)建庫包(如JAR文件)以及將庫安裝在本地Maven依賴項存儲庫中。

要嘗試構(gòu)建,請在命令行中輸入以下內(nèi)容:

mvn compile

這將運行Maven,告訴它執(zhí)行編譯目標。 完成后,應該在target/classes目錄中找到已編譯的.class文件。

由于不想直接分發(fā)或處理.class文件,那么可運行包目標:

mvn package

包目標將編譯您的Java代碼,并運行測試,并通過將代碼打包到目標目錄中的JAR文件中完成。 JAR文件的名稱將基于項目的<artifactId><version>。 例如,上面給出的最小pom.xml文件,JAR文件將被命名為gs-maven-0.1.0.jar。

如果您已將<packaging>的值從“jar”更改為“war”,則結(jié)果將是目標目錄中的WAR文件而不是JAR文件。

Maven還在本地機器上維護一個依賴庫(通常位于主目錄的.m2/repository目錄中),以便快速訪問項目依賴項。如果想將項目的JAR文件安裝到本地存儲庫,那么應該調(diào)用安裝目標:

mvn install

安裝目標將編譯,測試和打包項目代碼,然后將其復制到本地依賴項存儲庫中,以供其他項目將其作為依賴項引用。

說到依賴關(guān)系,現(xiàn)在是時候在Maven構(gòu)建中聲明依賴關(guān)系了。

聲明依賴關(guān)系

簡單的Hello World示例是完全自包含的,不依賴于任何其他庫。 然而,大多數(shù)應用程序依賴于外部庫來處理常見和復雜的功能。

例如,假設(shè)除了說出“Hello World!”之外,還希望應用程序打印當前的日期和時間。 您可以在本地Java庫中使用日期和時間工具實現(xiàn),但這里為了更好的演示,使用Joda Time庫來實現(xiàn)。

首先,將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類來獲取并打印當前時間。

如果現(xiàn)在要運行mvn compile來構(gòu)建項目,則構(gòu)建會失敗,因為我們尚未將Joda Time聲明為構(gòu)建中的編譯依賴項??梢酝ㄟ^將以下行添加到pom.xml(在<project>元素中)來解決該問題:

<dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.2</version>
        </dependency>
</dependencies>

這個XML塊為項目聲明了一個依賴關(guān)系列表。 具體來說,它聲明了Joda時間庫的一個依賴項。 在<dependency>元素中,依賴關(guān)系坐標由三個子元素定義:

  • <groupId> - 依賴項所屬的組或組織。
  • <artifactId> - 需要的類庫。
  • <version> - 需要的庫的特定版本。

默認情況下,所有依賴項的作用范圍都是編譯依賴關(guān)系。 也就是說,它們應該在編譯時可用(并且如果正在構(gòu)建WAR文件,包括WAR中的/WEB-INF/libs文件夾)。 另外,可以指定一個<scope>元素來指定下列其中一個范圍:

  • provided - 編譯項目代碼所需的依賴項,但運行時由運行代碼的容器(例如Java Servlet API)提供。
  • test - 用于編譯和運行測試的依賴項,但不是構(gòu)建或運行項目運行時代碼所必需的。

現(xiàn)在,如果運行mvn compile或mvn包,Maven應該解決來自Maven Central存儲庫的Joda Time依賴關(guān)系,并且構(gòu)建將會成功。

編寫測試

首先將JUnit作為依賴添加到pom.xml中,在測試范圍內(nèi):

<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”的插件來運行單元測試。 該插件的默認配置編譯并運行src/test/java中名稱匹配*Test的所有類。 您可以像這樣在命令行上運行測試 -

mvn test

或者只是使用mvn安裝步驟,因為我們已經(jīng)在上面展示過了(有一個生命周期定義,其中“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文件的可執(zhí)行性。本教程是使用Maven來開發(fā),不使用特定的插件。

編譯結(jié)果如下 -

運行測試結(jié)果如下 -

運行輸出結(jié)果 -

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>

可以看到,程序已經(jīng)輸出當前時間。