Skip to content

常用构建工具(Maven / Gradle 入门)

概述

构建工具(Build Tool)负责编译、测试、打包、发布等重复性工作,并统一管理依赖(第三方库)。手写 javac 和 classpath 在小型练习中尚可,一旦项目变大、依赖增多,就需要 Maven 或 Gradle 这类工具。两者都支持约定优于配置:约定好目录结构后,一条命令即可完成构建。

  • Maven:基于 XML 配置(pom.xml),生态成熟、资料多,企业中使用广泛。
  • Gradle:基于 Groovy/Kotlin DSL 的构建脚本,配置更灵活、增量构建快,Android 与很多新项目选用。

本文从安装项目结构依赖管理常用命令四方面做入门介绍,便于你快速在本地跑起一个 Maven 或 Gradle 项目。

适用场景

入门阶段任选其一即可;实际项目以团队或公司使用的工具为准。建议先掌握 Maven 再接触 Gradle,概念相通。


为什么需要构建工具

在不使用构建工具时,你通常需要:

  • 手动下载 JAR 并配置 classpath;
  • 自己组织 srcout 等目录;
  • 写脚本或多次执行 javacjava 完成编译和运行。

构建工具带来的好处:

  1. 依赖管理:在配置中声明依赖(如 JUnit、Spring),工具自动下载并加入 classpath。
  2. 统一目录结构:如 Maven 的 src/main/javasrc/test/java,团队与 CI 一致。
  3. 标准化生命周期:编译、测试、打包、安装等通过一条命令完成。
  4. 可重复构建:同一份配置在任何机器上得到相同结果,便于协作与发布。

Maven 入门

安装 Maven

  1. Maven 官网 下载 Binary 压缩包,解压到本地目录(如 C:\Program Files\Apache\maven/opt/maven)。
  2. 配置环境变量:
    • M2_HOME(或 MAVEN_HOME):指向 Maven 解压目录。
    • PATH:增加 %M2_HOME%\bin(Windows)或 $MAVEN_HOME/bin(Linux/macOS)。
  3. 验证:终端执行 mvn -v,应输出 Maven 与 JDK 版本信息。
bash
mvn -v
# Apache Maven 3.9.x
# Maven home: ...
# Java version: 17.x.x

Maven 项目结构(约定)

Maven 使用约定目录结构,无需在配置里逐个指定源码路径:

my-app/
  pom.xml                 # 项目配置与依赖(核心文件)
  src/
    main/
      java/               # 主代码
        com/example/App.java
      resources/          # 主资源(配置文件等)
    test/
      java/               # 测试代码
        com/example/AppTest.java
      resources/          # 测试资源
  target/                 # 编译输出(可忽略,不提交版本库)

pom.xml 基本结构

pom.xml(Project Object Model)定义项目坐标、依赖和构建配置。以下是一个最小可用的示例:

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
           https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 项目坐标:groupId + artifactId + version 唯一标识一个项目/依赖 -->
    <groupId>com.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>my-app</name>
    <description>Maven 入门示例项目</description>

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

    <dependencies>
        <!-- 示例:JUnit 5 用于单元测试 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.10.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
  • groupId / artifactId / version:组成坐标,依赖也通过这三者声明。
  • properties:统一 JDK 版本与编码,便于维护。
  • dependencies:声明依赖;scopetest 表示仅测试时使用。

Maven 常用命令

在项目根目录(含 pom.xml 的目录)下执行:

命令说明
mvn compile编译主代码到 target/classes
mvn test编译并运行测试
mvn package编译、测试并打包(默认 JAR 到 target/
mvn clean删除 target/ 目录
mvn clean package先清理再打包,常用 before 发布
mvn dependency:tree查看依赖树,排查冲突
bash
# 典型开发流程:清理 → 编译 → 测试 → 打包
mvn clean package

提示

首次运行 Maven 会从中央仓库下载依赖与插件,可能较慢;可配置国内镜像(如阿里云)加速,见 Maven 配置镜像


Gradle 入门

安装 Gradle

  1. Gradle 官网 下载二进制包并解压,或将 bin 目录加入 PATH
  2. 也可通过 SDKMANHomebrew(macOS)安装:brew install gradle
  3. 验证:gradle -vgradlew -v(使用项目自带 Wrapper 时)。

很多项目不要求本机安装 Gradle,而是使用项目内的 Gradle Wrappergradlew / gradlew.bat),能保证所有人使用同一 Gradle 版本。

Gradle 项目结构(约定)

与 Maven 类似,Gradle 也约定默认目录:

my-app/
  build.gradle            # 构建脚本(常用)
  settings.gradle         # 项目/模块名
  gradlew / gradlew.bat   # Wrapper 脚本(Unix / Windows)
  gradle/
    wrapper/
      gradle-wrapper.properties
  src/
    main/
      java/
      resources/
    test/
      java/
      resources/
  build/                  # 编译输出(可忽略)

build.gradle 基本结构

以下为基于 Groovy DSL 的最小示例,等价于上面 Maven 的 pom.xml

groovy
plugins {
    id 'java'
}

group = 'com.example'
version = '1.0-SNAPSHOT'

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

repositories {
    mavenCentral()   // 从 Maven 中央仓库拉取依赖
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}
  • pluginsjava 插件提供 compileJavatestjar 等任务。
  • repositories:依赖来源,通常用 mavenCentral()
  • dependencies:声明方式为 'groupId:artifactId:version'testImplementation 表示仅测试时使用。

Gradle 常用任务

在项目根目录执行(使用 Wrapper 时用 ./gradlewgradlew.bat):

任务说明
gradle classes编译主代码
gradle test运行测试
gradle build编译、测试、打包
gradle clean删除 build/ 目录
gradle clean build先清理再完整构建
gradle dependencies查看依赖树
bash
# 使用 Wrapper(推荐)
./gradlew clean build

版本说明

若使用 Kotlin DSL,构建脚本为 build.gradle.kts,语法为 Kotlin;概念与 Groovy 版一致,仅写法不同。


使用示例

示例 1:用 Maven 创建一个可运行 JAR

pom.xml 中指定主类并配置打包插件,即可生成「可执行」JAR:

xml
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.example.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

打包后运行:

bash
mvn clean package
java -jar target/my-app-1.0-SNAPSHOT.jar

示例 2:用 Gradle 声明多个依赖

build.gradledependencies 中增加主代码与测试依赖:

groovy
dependencies {
    implementation 'com.google.guava:guava:32.1.1-jre'   // 主代码使用
    testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}
  • implementation:仅对当前模块暴露,依赖不会传递到上层,推荐日常使用。
  • api:依赖会传递给使用本模块的模块,适合库项目暴露接口依赖。

执行 ./gradlew build 时,Gradle 会下载上述依赖并参与编译与测试。

示例 3:Maven 添加国内镜像(加速)

在用户目录下的 .m2/settings.xml(若不存在可新建)中配置阿里云镜像:

xml
<settings>
    <mirrors>
        <mirror>
            <id>aliyun-central</id>
            <mirrorOf>central</mirrorOf>
            <name>Aliyun Maven</name>
            <url>https://maven.aliyun.com/repository/central</url>
        </mirror>
    </mirrors>
</settings>

之后依赖下载会走阿里云,速度通常更快。


Maven 与 Gradle 简要对比

方面MavenGradle
配置格式XML(pom.xmlGroovy/Kotlin DSL(build.gradle
学习资料多,企业常见逐渐增多,新项目常见
构建速度相对较慢增量构建快
灵活性约定固定,扩展靠插件脚本化,自定义任务方便
适用传统企业、Spring 等Android、新项目、多模块

提示

不必纠结「先学哪个」:掌握一个后,另一个的概念(坐标、依赖、生命周期/任务)基本一致,切换成本不高。


注意事项

依赖范围(scope)

Maven 的 scope(如 compiletestprovided)和 Gradle 的 implementationtestImplementation 等会影响依赖是否参与编译、测试或打包。误用可能导致运行时找不到类或 JAR 体积过大;新增依赖时注意选择合适范围。

版本冲突

多级依赖可能引入同一库的不同版本。Maven 使用「最近定义」等规则;Gradle 可查看 dependency:tree / dependencies 排查,并在配置中通过 exclude 或强制版本来统一。

不要提交 target / build

target/(Maven)和 build/(Gradle)为构建产物,应加入 .gitignore,不要提交到版本库。


相关链接

基于 VitePress 构建