使用Maven构建Java工程

  这篇博客会带你一起来使用Maven构建Java工程。

创建一个Java工程

  首先,新建一个Java工程,用于演示如何使用Maven来构建它。为了让我们更关注如何使用Maven,我们将这个工程建得非常简单。

  创建一个工程根目录,然后在Terminal打开它。

$ mkdir gs-maven
$ cd gs-maven

  使用命令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构建

  现在Maven已经安装好了,你需要将工程转换成Maven工程。Maven工程使用一个名为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 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>

    <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 model version(一般来说都是4.0.0)。
  • <groupId>. 工程所属的分组或组织。通常使用反序域名作为groupId。
  • <artifactId>. 工程打包名。(比如JAR、WAR文件的名字)
  • <version>. 工程版本号。
  • <packaging>. 标记工程以什么方式打包。默认使用jar来打包JAR包,使用war来打包WAR文件。

  到此为止,你已经将工程转成Maven工程了。

Build Java code

  Maven现在已经准备好构建工程了。你现在可以执行一系列Maven的构建周期目标(build lifecycle goal)了,包括编译工程代码,创建库包(library package),以及将库安装到Maven本地依赖库中。

  使用以下命令来构建项目。

mvn compile

  这个命令会开始运行Maven,并让它去执行编译目标(compile goal)。当命令执行完毕之后,你可以在target/classes目录下找到编译好的.class文件。

  你应该不会想要直接使用.class文件,你应该会将它们打包后再使用:

mvn package

  打包目标(package goal)会编译你的Java代码,运行所有测试,然后将target下编译好的代码打包成JAR文件。JAR文件会根据pom.xml中的<artifactId><version>来命名。在这个例子中,JAR文件最后会被命名为gs-maven-0.1.0.jar

  Maven会在你本地机器里持有一个仓库,用于存放你的依赖(通常在.m2/repository目录下),以便可以快速解决项目依赖。如果你想把你的工程打包好的JAR文件添加到这个仓库中,你可以使用install命令。

mvn install

  安装目标(install goal)将会编译、测试、将工程打包起来,最后将它复制到本地他库中,这样其它工程就可以引用这个包作为它们的依赖了。

  即然谈到了依赖,那么现在,我们来为工程声明一个依赖,看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 TimeLocalTime类来获取以及显示当前的时间。

  如果你现在使用maven compile来构建项目,这个任务将会失败,因为你还没有声明项目需要使用依赖Joda Time库。你可以通过把下面的内容加到pom.xml文件下的<project>节点修复这个问题。

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

  以上的XML为项目声明了一个依赖列表。现在这个列表只有一项Joda Time依赖。在<dependency>元素中,依赖坐标(dependency coordinates)由三个元素组成:

  • <groupId>. 这个依赖归属的分组或组织
  • <artifactId>. 这个依赖的名字
  • <version>. 这个依赖的版本号

  Maven默使使用compile依赖。这意味着,他们在编译时(compile-time)应该是可用的(如果你是在打包WAR文件,这些依赖会被包含到/WEB-INF/libs目录下)。除了compile之类,<scope>可以指定为以下类型:

  • provided. 仅在编译时依赖,这个库会在容器运行时提供(比如Java Servlet API)。
  • test. 仅在运行测试用例时依赖,在打包或运行项目时不需要依赖。

  现在,你再次运行mvn compile或者mvn package,Maven就可以从Maven中央库(Maven Central repository)里找到你需要的Joda Time依赖,并正确执行任务。

  以下是完成之后的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>

    <!-- tag::joda[] -->
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>
    <!-- end::joda[] -->

    <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 Plugin来生成可执行的JAR文件。这篇博客我们更关注如何入门Maven,而不是怎么来使用特定的插件。

总结

  恭喜你,你现在已经可以使用Maven来简单、高效地构建Java项目了。

Alan Yeh

简单技术控,喜欢接触各类技术

GZ, China http://yerl.cn