Build

What is “Build”

简单来说,build 就是把一系列代码变成可执行的(二进制)文件。

Dependency Management

一开始,Dependency Management主要focus在文件版本管理上;慢慢地,随着项目越来越复杂,引入的包越来越多,重心放在了lib管理上。

Build Tools

Tools Development

Make

上世纪7,80年代,主流是使用make,用来编译各种语言的代码,当然主要是C语言。

Ant

慢慢地,Java语言越来越流行,但是,为C语言设计的make和Java兼容性不是很好。于是,一款专门为Java设计的Build工具出现了,就是AntAnt参考了大量make的设计,所以程序员们切换过来很方便。它使用了XML格式,一般项目的编译脚本被命名为build.xml。 同时,它给开发人员留下了非常大的自由度 flexbility 。比如,程序员们需要手动写每一个操作的编译脚本,如下:

<target name="jar" depends="compile">
    <mkdir dir="jar" />
    <jar destfile="jar/HelloWorld.jar" basedir="classes">
        <manifest>
            <attribute name="Main-Class" 
              value="antExample.HelloWorld" />
        </manifest>
    </jar>
</target>

Ivy

项目越来越大,也越来越模块化,需要引用到大量地其它类库,Dependency Management变得越来越重要。

所以,Ivy诞生了,它是为了配合Ant,使得Java程序能够顺利地build。

Maven

Ant + Ivy 是一个很流行组合,但是也有一个问题:Ant有点繁琐 / 难用。 新建一个项目,我需要写一大堆的 build 脚本,而且可能都是从其它项目 copy/paste 过来的。 有没有更“偷懒”的工具呢?

Maven出现了,它的核心思想是:

所以,我们配置一个Maven项目,只要写pom.xml就行了,而pom文件的主要内容是要引入哪些dependency。 我们不需要再自己写一个名为jartarget,而是直接使用maven package命令就可以了。

程序员们做出的牺牲是,需要遵循 maven 项目的 convension。比如,项目的目录结构,如下:

+---src
|   +---main
|   |   +---java
|   |   |   \---com
|   |   |       \---learn
|   |   |           \---maven
|   |   |                   HelloWorld.java
|   |   |                   
|   |   \---resources
|   \---test
|       +---java
|       \---resources

(注:当然,现在随着框架越来越多,dependency越来越多,Maven的pom文件也非常长,所以Spring Boot出现了,技术就是这样不断演进的。)

Gradle

Gradle是一个和Maven“差不多”的build工具。

从设计上,它希望将build变得更加简单,从而替代Maven,但是到目前为止,好像还没有成功。

有两个关键点:

一个build.gradle的例子如下:

apply plugin: 'java'
 
repositories {
    mavenCentral()
}
 
jar {
    baseName = 'gradleExample'
    version = '0.0.1-SNAPSHOT'
}
 
dependencies {
    testImplementation 'junit:junit:4.12'
}

参考 -> https://www.baeldung.com/ant-maven-gradle

Fork me on GitHub