重拾Java之构建工具


如题

代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。 – 阮一峰

Make

  • 诞生于1977年
  • 主要用于C语言
  • 支持类Unix和Windows
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    edit : main.o kbd.o command.o display.o 
    cc -o edit main.o kbd.o command.o display.o

    main.o : main.c defs.h
    cc -c main.c
    kbd.o : kbd.c defs.h command.h
    cc -c kbd.c
    command.o : command.c defs.h command.h
    cc -c command.c
    display.o : display.c defs.h
    cc -c display.c

    clean :
    rm edit main.o kbd.o command.o display.o

    .PHONY: edit clean

Ant

  • 2000年发布,用于构建Java项目
  • 解决可恶的Tab问题,使用XML配置
  • 跨平台性,操作简单,可集成到开发环境

build.xml实例

1
2
3
4
5
6
7
8
9
10
11
12
13
<project>
<property/>

<property/>
......
<target name="init">
......
</target>

<target>
......
</target>
</project>

Maven

  • 发布于2004年,解决Ant的一些问题
  • 靠约定并提供现成的可调用的目标
  • 主要有点是生命周期,代价是牺牲了灵活性

pom.xml实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<project>
<modelVersion>4.0.0</modelVersion> <!-->maven版本</-->
<groupId>cc.bitky.demo</groupId> <!-->项目的包名</-->
<artifactId>demo-module</artifactId> <!-->模块名</-->
<version>1.0.0-SNAPSHOT</version> <!-->版本</-->
<packaging>jar</packaging>
<name>demo-module</name>
<url>http://maven.apache.org</url>
<!-- 依赖项 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
<!-- 排除依赖传递列表 -->
<exclusions>
<exclusion></exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 依赖的管理,一般定义在父模块中,由子模块去继承 -->
<dependencyManagement>
<dependencies>
<dependency></dependency>
</dependencies>
</dependencyManagement>
<!-- 对构建行为提供相应的支持 -->
<build>
<!-- 插件列表 -->
<plugins>
<plugin>
<!-- 指定坐标 -->
</plugin>
</plugins>
</build>
<!-- 一般在子模块中指定所继承的父模块 -->
<parent></parent>
<!-- 模块列表 -->
<modules>
<module></module>
</modules>
</project>

Gradle

  • 2012年华丽诞生
  • 被Google选为Android构建工具
  • 结合了Ant和Maven的优点,约定好,灵活性也高
  • 贯穿软件的生命周期:编译,检查,测试,打包和部署
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apply plugin: 'java'  
apply plugin: 'checkstyle'
apply plugin: 'findbugs'
apply plugin: 'pmd'

version = '1.0'

repositories {
mavenCentral()
}

dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
}

前端构建

Node, NPM, Grunt, Gulp, Bower, Webpack, Browserify, Yeoman, Brunch……诸多的名词让你一时间感到手足无措,好像根本学不完。

其实关键就是,不要被它们唬住。要知道,所有这些工具,其最初的设计目的,都是要让你的工作变得更简单。

  • 2009年,npm
  • 2012年,grunt
  • 2012年,bower
  • 2013年,yeoman
  • 2014年,gulp
  • 2015年,fis3
  • 2017年,webpack3
  • 2018年,@vue-cli