Java进阶(二:Maven——Java项目管理工具)

什么是Maven?

Maven 是一个强大的 项目管理和构建自动化工具,主要用于 Java 项目。它通过项目对象模型(POM,Project Object Model)来描述项目,管理依赖、构建生命周期、插件等,极大地简化了 Java 项目的构建和管理过程。他极大的简化了java的依赖管理,同时让采用maven架构的项目长得一样整齐,便于维护二开。举几个没有maven的糟糕例子。

如果没有Maven

手动找 jar:打开搜索引擎 → 输入"spring-core-5.3.9.jar 下载" → 点进广告满天飞的论坛 → 下错版本 → 运行时报 NoSuchMethodError → 重下 → 再试。

版本冲突靠眼神:A 框架要 log4j-1.2.17,B 框架要 log4j-1.2.15,你只有把两个 jar 都扔进 lib,classpath 里谁先谁后全凭天命。

目录结构"百家争鸣" : 张三把源码放 src/,李四放 source/,王五把测试代码叫 testSrc/;新人入职第一件事是问"咱们这个项目咋编译?"

构建脚本成"传家宝" :每人私藏一份 2000 行 Ant XML,里面硬编码了 D:\tomcat\webapps 路径;换台电脑就跑不起来。

CI/CD 寸步难行: Jenkins 里要先把 jar 拷到 lib、再改版本号、再手动点按钮;上线一次 30 分钟,喝 3 杯咖啡等结果。

Maven 的核心功能:

功能 说明
依赖管理 自动下载和管理项目所需的第三方库(如 Spring、MyBatis 等),避免手动导入 jar 包。
项目构建 提供标准化的构建流程:编译、测试、打包、部署等。
统一结构 规定项目目录结构(如 src/main/javasrc/test/java),提高项目可读性和可维护性。
插件机制 支持通过插件扩展功能,如打包成 jar、war,生成文档,运行测试等。
多模块支持 支持大型项目的模块化开发,便于管理多个子项目。

如何搭建第一个 Maven 工程

1. 环境准备

  • 安装 JDK:确保已安装 Java Development Kit

  • 安装 Maven:下载并配置 Apache Maven 环境变量

  • 验证安装 :在命令行执行以下命令确认安装成功

    bash 复制代码
    mvn -version

2. 创建 Maven 项目

IDE创建

在Idea等编辑器新建项目时在"构建系统"中选择Maven

使用命令行创建

bash 复制代码
mvn archetype:generate -DgroupId=com.example -DartifactId=my-first-maven-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

手动创建项目结构

css 复制代码
my-first-maven-project/
├── src/
│   ├── main/
│   │   └── java/
│   │       └── com/
│   │           └── example/
│   │               └── App.java
│   └── test/
│       └── java/
│           └── com/
│               └── example/
│                   └── AppTest.java
└── pom.xml

3. 配置 pom.xml

创建基本的 pom.xml 文件:

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>my-first-maven-project</artifactId>
    <version>1.0-SNAPSHOT</version>

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

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

4. 编写代码

src/main/java/com/example/App.java 中创建主类:

java 复制代码
package com.example;

public class App {
    public static void main(String[] args) {
        System.out.println("Hello Maven!");
    }
    
    public String sayHello(String name) {
        return "Hello " + name + "!";
    }
}

5. 编译和构建

编译项目

bash 复制代码
mvn compile

运行测试

bash 复制代码
mvn test

打包项目

bash 复制代码
mvn package

清理构建结果

bash 复制代码
mvn clean

6. Maven 标准目录结构

  • src/main/java/:Java 源代码
  • src/main/resources/:资源文件
  • src/test/java/:测试代码
  • src/test/resources/:测试资源文件
  • target/:构建输出目录
  • pom.xml:项目对象模型文件

POM 文件全解

1. POM 基本概念

Project Object Model (POM) 是 Maven 项目的核心配置文件,定义了项目的基本信息、依赖关系、构建配置等内容。

2. 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>my-app</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <!-- 属性配置 -->
    <properties>
        <java.version>1.8</java.version>
    </properties>
    
    <!-- 依赖配置 -->
    <dependencies>
        <!-- 依赖项 -->
    </dependencies>
    
    <!-- 构建配置 -->
    <build>
        <!-- 构建插件 -->
    </build>
</project>

3. 核心元素详解

3.1 基本坐标信息

  • groupId: 组织标识符,通常使用反向域名
  • artifactId: 项目唯一标识符
  • version: 项目版本号
  • packaging: 打包方式(jar、war、pom等)

3.2 属性配置 (properties)

xml 复制代码
<properties>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

3.3 依赖管理 (dependencies)

xml 复制代码
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>
依赖范围 (scope)
  • compile: 编译依赖(默认)
  • provided: 编译和测试时需要,运行时由容器提供
  • runtime: 运行和测试时需要,编译不需要
  • test: 仅测试时需要
  • system: 系统级依赖

3.4 继承与聚合

父项目继承
xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.14</version>
    <relativePath/>
</parent>
子模块聚合
xml 复制代码
<modules>
    <module>module1</module>
    <module>module2</module>
</modules>

4. 构建配置 (build)

4.1 插件配置

xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

4.2 资源配置

xml 复制代码
<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>

5. 依赖管理进阶

5.1 依赖管理 (dependencyManagement)

xml 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>

5.2 排除依赖

xml 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.0</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

6. Profiles 配置

xml 复制代码
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <environment>development</environment>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <environment>production</environment>
        </properties>
    </profile>
</profiles>

7. 仓库配置

7.1 远程仓库

xml 复制代码
<repositories>
    <repository>
        <id>central</id>
        <url>https://repo.maven.apache.org/maven2</url>
    </repository>
</repositories>

7.2 插件仓库

xml 复制代码
<pluginRepositories>
    <pluginRepository>
        <id>central</id>
        <url>https://repo.maven.apache.org/maven2</url>
    </pluginRepository>
</pluginRepositories>

8. 常用 Maven 属性

  • ${project.groupId}: 项目 groupId
  • ${project.artifactId}: 项目 artifactId
  • ${project.version}: 项目版本
  • ${project.build.directory}: 构建目录(target)
  • ${project.build.outputDirectory}: 输出目录(target/classes)
  • ${project.build.testOutputDirectory}: 测试输出目录(target/test-classes)

POM 文件是 Maven 项目的核心,合理配置 POM 可以有效管理项目依赖、构建过程和发布流程。

Maven 生命周期与插件

1. Maven 生命周期

Maven 生命周期是 Maven 构建过程的抽象表示,定义了构建项目的各个阶段。

1.1 三套生命周期

Clean Lifecycle(清理生命周期)
  • pre-clean: 执行清理前的工作
  • clean: 清理上一次构建生成的文件(删除 target 目录)
  • post-clean: 执行清理后的工作
Default Lifecycle(默认生命周期)
  • validate: 验证项目正确性和必要信息
  • initialize: 初始化构建状态
  • generate-sources: 生成需要编译的源码
  • process-sources: 处理源码
  • generate-resources: 生成需要打包的资源文件
  • process-resources: 处理资源文件并复制到目标目录
  • compile: 编译项目的源码
  • process-classes: 处理编译后的class文件
  • generate-test-sources: 生成测试需要的源码
  • process-test-sources: 处理测试源码
  • generate-test-resources: 生成测试需要的资源文件
  • process-test-resources: 处理测试资源文件
  • test-compile: 编译测试源码
  • process-test-classes: 处理编译后的测试class文件
  • test: 使用单元测试框架运行测试
  • prepare-package: 打包前的准备工作
  • package: 将编译后的代码打包成可分发格式
  • pre-integration-test: 集成测试前的准备工作
  • integration-test: 处理和部署包到集成测试环境
  • post-integration-test: 集成测试后的操作
  • verify: 运行检查验证包是否有效且达到质量标准
  • install: 将包安装到本地仓库
  • deploy: 将最终的包复制到远程仓库
Site Lifecycle(站点生命周期)
  • pre-site: 生成站点文档前的处理
  • site: 生成项目的站点文档
  • post-site: 生成站点文档后的处理
  • site-deploy: 将生成的站点文档部署到指定服务器

1.2 生命周期特点

  • 后面的阶段依赖于前面的阶段
  • 跳转到某个阶段会自动执行前面的所有阶段
  • 不同生命周期可以同时执行

2. Maven 插件

Maven 插件是实际执行构建任务的组件,每个阶段都由特定插件的目标(goal)来执行。

2.1 插件类型

Build Plugins(构建插件)

在构建生命周期中执行,在 pom.xml<build> 元素中配置:

xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
        </plugin>
    </plugins>
</build>
Reporting Plugins(报告插件)

在站点生成过程中执行,在 pom.xml<reporting> 元素中配置:

xml 复制代码
<reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>3.2.0</version>
        </plugin>
    </plugins>
</reporting>

2.2 常用核心插件

插件 功能 默认绑定阶段
maven-clean-plugin 清理构建产物 clean
maven-compiler-plugin 编译Java源码 compile, testCompile
maven-resources-plugin 处理资源文件 process-resources, process-test-resources
maven-surefire-plugin 运行单元测试 test
maven-jar-plugin 打包JAR文件 package
maven-war-plugin 打包WAR文件 package
maven-install-plugin 安装到本地仓库 install
maven-deploy-plugin 部署到远程仓库 deploy

2.3 插件配置示例

编译插件配置
xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>
打包插件配置
xml 复制代码
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <mainClass>com.example.Application</mainClass>
    </configuration>
</plugin>

3. 命令行执行

3.1 执行特定阶段

bash 复制代码
mvn clean              # 执行 clean 生命周期到 clean 阶段
mvn compile            # 执行 default 生命周期到 compile 阶段
mvn test               # 执行 default 生命周期到 test 阶段
mvn package            # 执行 default 生命周期到 package 阶段
mvn install            # 执行 default 生命周期到 install 阶段
mvn site               # 执行 site 生命周期到 site 阶段

3.2 执行特定插件目标

bash 复制代码
mvn plugin:goal
mvn compiler:compile
mvn surefire:test
mvn help:describe -Dplugin=compiler

3.3 组合执行

bash 复制代码
mvn clean install      # 先清理再安装
mvn clean compile test # 清理、编译、测试

4. 自定义插件绑定

可以在 pom.xml 中自定义插件绑定到特定阶段:

xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.8</version>
            <executions>
                <execution>
                    <id>echo-message</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <tasks>
                            <echo>Hello from AntRun Plugin!</echo>
                        </tasks>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Maven 的生命周期和插件机制提供了强大的构建自动化能力,通过合理的配置可以满足各种复杂的构建需求。

其他构建框架

除了Maven之外,Java生态中还有多种仓库管理工具,每种工具都有其独特的特点和适用场景‌。

  • Ant‌ 是最早的构建工具,专注于通过XML脚本实现项目构建自动化,但缺乏内置的依赖管理功能‌56
  • Ivy‌ 是依赖管理工具,通常与Ant配合使用,为Ant项目提供依赖管理能力‌12
  • Maven‌ 在Ant基础上发展而来,集成了依赖管理、项目结构约定和构建生命周期,采用"约定优于配置"原则‌45
  • Gradle‌ 融合了Ant的灵活性和Maven的依赖管理,使用Groovy/Kotlin DSL,提供了更强大的构建能力‌34
相关推荐
鹏北海2 小时前
TypeScript 类型工具与 NestJS Mapped Types
前端·后端·typescript
q***09802 小时前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
IT_陈寒3 小时前
React 19新特性实战:5个提升开发效率的技巧与避坑指南
前端·人工智能·后端
mzlogin3 小时前
解决访问 https 网站时,后端重定向或获取 URL 变成 http 的问题
java·后端·nginx
q***69774 小时前
快速在本地运行SpringBoot项目的流程介绍
java·spring boot·后端
q***42824 小时前
前端的dist包放到后端springboot项目下一起打包
前端·spring boot·后端
唐小码4 小时前
Redis RedisTimeSeries 在springboot中的应用
spring boot·redis·后端
回家路上绕了弯5 小时前
高并发订单去重:布隆过滤器过滤已存在订单号的实战方案
分布式·后端
申阳5 小时前
Day 11:集成百度统计以监控站点流量
前端·后端·程序员