You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
slms/docs/MakeAntMavenGradleBuildingT...

11 KiB

Java应用构建工具对比 (Windows环境)

概述

在Java应用开发中构建工具负责编译、打包、测试、部署等自动化任务。本文档重点介绍Windows环境下四个主流构建工具Make、Ant、Maven和Gradle的对比分析。

Make

出现时间

1976年由Stuart Feldman发明是最早的构建工具之一。

优缺点

优点:

  • 高度灵活,支持自定义构建规则
  • 性能优秀,只重新构建变更的文件
  • 跨平台但Windows兼容性较差
  • 学习曲线适中

缺点:

  • Makefile语法复杂维护成本高
  • Windows原生支持较弱需要安装额外的工具链
  • 缺乏内置的依赖管理
  • 不适合大型Java项目的复杂构建需求

主要应用场景

  • C/C++项目(传统领域)
  • 简单脚本自动化
  • 需要高度定制化的构建流程

 

生命周期

Make没有标准的生命周期概念但通常遵循以下构建流程

  1. 依赖分析: 解析Makefile中的依赖关系
  2. 增量构建: 只重新构建变更的文件
  3. 目标执行: 按依赖顺序执行规则
  4. 清理: 可选的清理操作

典型执行顺序:

make [target]
  ↓
解析依赖关系
  ↓
检查文件时间戳
  ↓
执行变更的规则
  ↓
完成目标

Windows使用注意

  • 需要安装MSYS2、Cygwin或MinGW提供make命令
  • 文件路径使用正斜杠/而非反斜杠\
  • 命令行工具兼容性问题较多

示例 (Makefile)

# Makefile 示例
JAVAC = javac
JAVA = java
SOURCES = $(wildcard *.java)
CLASSES = $(SOURCES:.java=.class)

all: compile run

compile: $(CLASSES)

%.class: %.java
	$(JAVAC) $<

run: compile
	$(JAVA) Main

clean:
	rm -f *.class

Ant (Apache Ant)

出现时间

2000年作为Apache Tomcat项目的构建工具诞生。

优缺点

优点:

  • 平台无关纯Java实现
  • 高度可定制XML配置灵活
  • 丰富的内置任务
  • 轻量级,无复杂依赖

缺点:

  • XML配置冗长可读性差
  • 缺乏依赖管理需手动管理JAR
  • 学习曲线陡峭
  • 构建脚本维护困难

主要应用场景

  • 遗留Java项目改造
  • 需要精细控制构建过程的项目
  • 与其他Apache工具集成

示例 (build.xml)

<?xml version="1.0"?>
<project name="HelloWorld" default="run">
    <property name="src.dir" value="src"/>
    <property name="build.dir" value="build"/>
    <property name="lib.dir" value="lib"/>

    <target name="init">
        <mkdir dir="${build.dir}"/>
    </target>

    <target name="compile" depends="init">
        <javac srcdir="${src.dir}" destdir="${build.dir}">
            <classpath>
                <fileset dir="${lib.dir}" includes="*.jar"/>
            </classpath>
        </javac>
    </target>

    <target name="jar" depends="compile">
        <jar destfile="HelloWorld.jar" basedir="${build.dir}">
            <manifest>
                <attribute name="Main-Class" value="com.example.HelloWorld"/>
            </manifest>
        </jar>
    </target>

    <target name="run" depends="jar">
        <java jar="HelloWorld.jar" fork="true"/>
    </target>

    <target name="clean">
        <delete dir="${build.dir}"/>
        <delete file="HelloWorld.jar"/>
    </target>
</project>

Maven

出现时间

2004年从Jakarta Turbine项目中分离出来。

优缺点

优点:

  • "约定优于配置",标准化项目结构
  • 强大的依赖管理Maven Central仓库
  • 丰富的插件生态系统
  • 内置生命周期管理
  • 跨平台支持良好

缺点:

  • XML配置冗长
  • 学习曲线较陡
  • 构建速度相对较慢
  • 定制化程度不如Ant和Gradle

生命周期

Maven有三大内置生命周期每个生命周期包含多个阶段

Clean Lifecycle (清理生命周期):

  • pre-clean: 执行清理前的工作
  • clean: 清理上一次构建生成的文件
  • post-clean: 执行清理后的工作

Default Lifecycle (默认生命周期):

  • validate: 验证项目结构和配置
  • initialize: 初始化构建状态
  • generate-sources: 生成编译所需的源代码
  • process-sources: 处理源代码
  • generate-resources: 生成资源文件
  • process-resources: 处理资源文件并复制到目标目录
  • compile: 编译项目源代码
  • process-classes: 处理编译后的文件
  • generate-test-sources: 生成测试源代码
  • process-test-sources: 处理测试源代码
  • generate-test-resources: 生成测试资源
  • process-test-resources: 处理测试资源
  • test-compile: 编译测试源代码
  • process-test-classes: 处理测试编译文件
  • test: 运行测试
  • prepare-package: 准备打包前的工作
  • package: 打包编译后的代码
  • pre-integration-test: 集成测试前的工作
  • integration-test: 运行集成测试
  • post-integration-test: 集成测试后的工作
  • verify: 验证包是否有效
  • install: 安装包到本地仓库
  • deploy: 部署包到远程仓库

Site Lifecycle (站点生命周期):

  • pre-site: 生成站点前的工作
  • site: 生成项目站点文档
  • post-site: 生成站点后的工作
  • site-deploy: 部署站点到服务器

执行顺序:

mvn [phase]
  ↓
激活指定生命周期
  ↓
按顺序执行所有前序阶段
  ↓
执行插件目标
  ↓
完成构建

示例 (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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>hello-world</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

常用命令

# 编译
mvn compile

# 测试
mvn test

# 打包
mvn package

# 清理
mvn clean

# 完整构建
mvn clean install

Gradle

出现时间

2007年旨在替代Maven和Ant的不足。

优缺点

优点:

  • Groovy DSL配置简洁可读
  • 高度灵活,支持自定义逻辑
  • 增量构建,性能优异
  • 强大的依赖管理
  • 支持多语言项目

缺点:

  • 学习曲线陡峭Groovy语法
  • 构建脚本复杂度较高
  • Windows下首次构建可能较慢Gradle Wrapper下载

主要应用场景

  • 现代Java项目Spring Boot 2.x+
  • Android应用开发
  • 多模块企业项目
  • 需要复杂构建逻辑的项目

生命周期

Gradle没有预定义的生命周期但通过任务依赖形成构建流程

标准构建流程:

  1. 初始化: 解析settings.gradle和build.gradle
  2. 配置: 执行build.gradle脚本创建任务图
  3. 执行: 按依赖顺序执行任务

核心生命周期任务:

  • assemble: 组装项目产物(编译、打包)
  • check: 运行所有检查(测试、代码质量)
  • build: 执行完整构建assemble + check
  • clean: 清理构建产物

Java插件生命周期任务:

compileJava → processResources → classes → jar → assemble
testCompileJava → processTestResources → testClasses → test → check

Android插件生命周期任务:

preBuild → assembleDebug → assembleRelease → assemble
connectedDebugAndroidTest → connectedCheck → check

执行顺序:

gradle [task]
  ↓
解析构建脚本
  ↓
构建任务依赖图
  ↓
按拓扑顺序执行任务
  ↓
执行任务动作
  ↓
完成构建

任务类型:

  • 编译: JavaCompile, GroovyCompile
  • 测试: Test, JacocoReport
  • 打包: Jar, War, Zip
  • 发布: Publish, Upload
  • 文档: Javadoc, Groovydoc

示例 (build.gradle)

plugins {
    id 'java'
    id 'application'
}

group = 'com.example'
version = '1.0.0'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'junit:junit:4.13.2'
    implementation 'com.google.guava:guava:30.1-jre'
}

application {
    mainClassName = 'com.example.HelloWorld'
}

// 自定义任务示例
task fatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.example.HelloWorld'
    }
    from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

常用命令

# 编译
gradle compileJava

# 测试
gradle test

# 构建
gradle build

# 运行应用
gradle run

# 清理
gradle clean

工具对比表

特性 Make Ant Maven Gradle
出现时间 1976 2000 2004 2007
配置语言 Makefile XML XML Groovy
依赖管理 手动 自动 自动
学习难度 中等 中等
构建速度 中等 中等
平台支持 一般 优秀 优秀 优秀
生命周期 自定义规则 Target依赖 标准阶段 任务依赖图
主要优势 灵活定制 平台无关 标准化 现代化

Windows环境推荐

推荐选择

  1. 新项目首选: Gradle现代化、灵活、高性能
  2. 企业标准化: Maven成熟稳定、团队协作好
  3. 遗留项目: Ant兼容性好、定制性强
  4. 简单脚本: Make轻量级但需额外工具

安装配置

  • Maven: 下载二进制包配置PATH环境变量
  • Gradle: 使用Gradle Wrapper推荐或安装二进制包
  • Ant: 下载并配置PATH
  • Make: 安装MSYS2或Chocolatey提供make命令

性能对比 (构建100个源文件的简单Java项目)

  • Make: ~2-3秒
  • Ant: ~3-5秒
  • Maven: ~5-8秒
  • Gradle: ~4-6秒 (首次较慢,后续增量构建快)

总结

选择构建工具应基于项目需求、团队经验和维护成本。对于Windows环境下的Java项目

  • 小项目/学习: 从Maven开始配置简单
  • 中大型项目: 推荐Gradle提供更好的灵活性和性能
  • 企业环境: Maven更适合标准化管理
  • 特殊需求: Ant或Make提供最大定制性

现代项目推荐使用Maven或Gradle两者都有良好的社区支持和生态系统。