Maven: 优秀的构建和依赖管理工具

每天我们的编程工作都不只是编写正确的代码,我们很大一部分时间消耗在了进行编译、单元测试、生成文档、打包、部署等等操作上面,这些微不足道的事情,占据了时间,消磨了激情。

Maven 很好地帮助我们从重复而繁琐的构建过程中解放出来,让这个过程自动化程度极大地提高了,让我们专注于编程与结果。

安装

其实安装很简单,但你将遇到的最大难点是:不同平台下如何配置“环境变量”。

这里附上官方文档:Homepage Download Install

我在 Windows 下遇到了一个问题,这个问题在 环境变量的引用顺序问题导致无效 这篇文章中得到了解决。

如果还有问题可以参阅 Maven的安装、配置及使用入门 这里的图文教程。

POM 文件

构建系统的配置文件,如同 make 的 Makefile、Ant 的 build.xml,Maven 的配置文件叫 pom.xml。

Project Object Model,项目对象模型。

一个简单的例子如下:

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>demo</groupId>
    <artifactId>helloworld</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties></properties>
    <dependencies></dependencies>
    <build>
        <plugins></plugins>
    </build>

</project>

groupId 定义了项目属于哪个组,比如 junitorg.springframework
artifactId 定义了一个项目在组中的唯一 ID,比如 junitspring-core
version 版本。

编写代码

默认 src/main/java 为项目主代码目录。src/main/resources 为项目主资源目录。这些代码将被打包到最终的构件中(如 jar 包)。

编译

在终端中执行命令:

$ mvn clean compile

便会自动运行以下插件和其执行目标:

  • clean:clean
  • resources:resources
  • compiler:compile

使用最新的 JDK

在我使用的 Maven 3 中,执行 compiler:compilemaven-compiler-plugin 这个核心编译插件默认使用 JDK 1.5,然而这并不是我们想要的,通过添加以下属性可更新至 JDK 1.8。

<properties>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

单元测试

在 Java 世界,JUnit 是单元测试的事实标准,我们需添加 JUnit 依赖。

<dependency>
    <groupId>junit</groupId>  
    <artifactId>junit</artifactId>  
    <version>4.12</version>  
    <scope>test</scope>  
</dependency>

默认 src/test/main 为测试代码目录。src/test/resources 为测试资源目录。这些将不会被打包到构件中。

编写测试用例:

import org.junit.Assert;
import org.junit.Test;

public class MyTest {

    @Test
    public void test() {
        Assert.assertEquals(2, 1+1);
    }
}

运行测试用例:

$ mvn clean test

在 Maven 执行 test 之前,它会先自动执行项目主资源处理,主代码编译,测试资源处理,测试代码编译等工作,具体可参考 Maven 的生命周期。

打包

$ mvn clean package

这将生成 target/${artifact}-${version}.jar 包。

安装

$ mvn clean install

将构建项目生成的 jar 包安装到 Maven 的本地仓库,供其他项目使用。

该步骤是可选的,按需使用。

运行

你可以通过指定类名运行 main 函数:

$ java -cp demo.helloworld.Application -jar target/helloworld-1.0-SNAPSHOT.jar

或者在 pom.xml 里写一条配置:

<properties>
    <start-class>demo.helloworld.Application</start-class>
</properties>

现在 jar 包的 META-INF/MANIFEST.MF 里就有了主类信息:

Main-Class: demo.helloworld.Application

可以直接运行:

$ java -jar target/helloworld-1.0-SNAPSHOT.jar

IntelliJ IDEA

以 IDEA 为 IDE 使用 Maven 可以获得非常愉快的体验。

IDEA 自带了 Maven 3,但如果本地安装了更高版本的 Maven,可以在 IDEA 的“设置”中选择它,最好加至“默认设置”里,避免每次都重复劳动。

编写完 pom.xml 后,在 IDEA 的 Project 里右键点击它,选 Maven -> Reimport 自动加载依赖,更新配置。

TODO

  • archetype
  • plugin
  • POM: module & parent
点赞