简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

Java开发者必学如何创建Maven项目从环境搭建到项目构建再到依赖管理的完整教程与实战案例分析

3万

主题

317

科技点

3万

积分

大区版主

木柜子打湿

积分
31893

财Doro三倍冰淇淋无人之境【一阶】立华奏小樱(小丑装)⑨的冰沙以外的星空【二阶】

发表于 2025-8-25 00:30:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

Apache Maven是Java开发中最流行的项目管理和构建工具之一。它通过一个中央信息管理的方式管理项目的构建、报告和文档,极大地简化了Java项目的构建过程。Maven不仅可以帮助开发者管理项目依赖,还可以自动化构建过程,标准化项目结构,从而提高开发效率。本教程将带领Java开发者从零开始,全面掌握Maven的使用,包括环境搭建、项目创建、依赖管理和构建过程,并通过实战案例加深理解。

1. Maven环境搭建

1.1 JDK安装与配置

在安装Maven之前,首先需要确保你的系统上已经安装了Java开发工具包(JDK)。Maven 3.3+版本要求JDK 1.7或更高版本。

检查JDK安装情况:
  1. java -version
复制代码

如果已安装,你会看到类似以下的输出:
  1. java version "1.8.0_291"
  2. Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
  3. Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
复制代码

如果未安装,请前往Oracle官网或OpenJDK官网下载并安装适合你操作系统的JDK版本。

1.2 Maven下载与安装

1. 访问Maven官方网站下载最新的Maven二进制压缩包(例如:apache-maven-3.8.6-bin.zip)。
2. 解压下载的压缩包到你选择的目录,例如:Windows:C:\Program Files\Apache\mavenLinux/Mac:/usr/local/apache-maven
3. Windows:C:\Program Files\Apache\maven
4. Linux/Mac:/usr/local/apache-maven

访问Maven官方网站下载最新的Maven二进制压缩包(例如:apache-maven-3.8.6-bin.zip)。

解压下载的压缩包到你选择的目录,例如:

• Windows:C:\Program Files\Apache\maven
• Linux/Mac:/usr/local/apache-maven

1.3 环境变量配置

Windows系统:

1. 右键点击”此电脑” → “属性” → “高级系统设置” → “环境变量”
2. 在”系统变量”中点击”新建”,创建变量名为MAVEN_HOME,变量值为你的Maven安装路径(例如:C:\Program Files\Apache\maven)
3. 找到Path变量,点击”编辑”,然后点击”新建”,添加%MAVEN_HOME%\bin

Linux/Mac系统:

编辑~/.bashrc或~/.zshrc文件(取决于你使用的shell),添加以下内容:
  1. export MAVEN_HOME=/usr/local/apache-maven
  2. export PATH=$MAVEN_HOME/bin:$PATH
复制代码

然后执行以下命令使配置生效:
  1. source ~/.bashrc
  2. # 或
  3. source ~/.zshrc
复制代码

1.4 验证Maven安装

打开命令行工具,执行以下命令:
  1. mvn -version
复制代码

如果安装成功,你会看到类似以下的输出:
  1. Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
  2. Maven home: /usr/local/apache-maven
  3. Java version: 1.8.0_291, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/jre
  4. Default locale: en_CN, platform encoding: UTF-8
  5. OS name: "mac os x", version: "10.15.7", arch: x86_64, family: "mac"
复制代码

1.5 配置Maven设置文件

Maven的全局配置文件是settings.xml,位于Maven安装目录的conf文件夹下。你可以根据需要修改此文件,例如:

1. 配置本地仓库位置:默认情况下,Maven将依赖下载到用户主目录下的.m2/repository文件夹。你可以通过修改settings.xml来更改这个位置:
  1. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  2.           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.           xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  4.   <!-- localRepository
  5.    | The path to the local repository maven will use to store artifacts.
  6.    |
  7.    | Default: ${user.home}/.m2/repository
  8.   -->
  9.   <localRepository>/path/to/your/local/repo</localRepository>
  10.   
  11.   <!-- 其他配置... -->
  12. </settings>
复制代码

1. 配置镜像:为了加速依赖下载,可以配置使用国内镜像,例如阿里云镜像:
  1. <mirrors>
  2.   <mirror>
  3.     <id>aliyunmaven</id>
  4.     <mirrorOf>*</mirrorOf>
  5.     <name>阿里云公共仓库</name>
  6.     <url>https://maven.aliyun.com/repository/public</url>
  7.   </mirror>
  8. </mirrors>
复制代码

2. 创建Maven项目

2.1 使用命令行创建Maven项目

Maven提供了多种原型(archetype)来快速创建项目。最常用的是maven-archetype-quickstart,用于创建简单的Java项目。
  1. mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
复制代码

命令参数说明:

• groupId: 项目组ID,通常是公司或组织域名的倒序
• artifactId: 项目ID,通常是项目名称
• archetypeArtifactId: 原型ID,指定使用哪种原型创建项目
• interactiveMode: 是否使用交互模式,false表示使用非交互模式

执行上述命令后,Maven会在当前目录下创建一个名为my-app的文件夹,其中包含标准的Maven项目结构。

2.2 使用IDE创建Maven项目

1. 打开IntelliJ IDEA,选择”File” → “New” → “Project”
2. 在左侧选择”Maven”
3. 勾选”Create from archetype”
4. 从列表中选择maven-archetype-quickstart
5. 点击”Next”
6. 输入GroupId(例如:com.example)
7. 输入ArtifactId(例如:my-app)
8. 点击”Next”,然后点击”Finish”

1. 打开Eclipse,选择”File” → “New” → “Other”
2. 在对话框中展开”Maven”文件夹,选择”Maven Project”
3. 点击”Next”
4. 勾选”Create a simple project (skip archetype selection)“,或者不勾选以选择原型
5. 点击”Next”
6. 输入GroupId(例如:com.example)
7. 输入ArtifactId(例如:my-app)
8. 点击”Finish”

2.3 Maven Web项目创建

如果你需要创建一个Java Web项目,可以使用maven-archetype-webapp原型:
  1. mvn archetype:generate -DgroupId=com.example -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
复制代码

或者在IDE中选择相应的原型进行创建。

3. Maven项目结构

创建的Maven项目通常具有以下标准目录结构:
  1. my-app
  2. ├── pom.xml                  # 项目对象模型配置文件
  3. ├── src
  4. │   ├── main
  5. │   │   ├── java             # Java源代码目录
  6. │   │   │   └── com
  7. │   │   │       └── example
  8. │   │   │           └── App.java
  9. │   │   ├── resources        # 资源文件目录
  10. │   │   └── webapp           # Web应用目录(如果是Web项目)
  11. │   │       ├── WEB-INF
  12. │   │       │   └── web.xml  # Web应用配置文件
  13. │   │       └── index.jsp    # JSP页面
  14. │   └── test
  15. │       ├── java             # 测试Java源代码目录
  16. │       │   └── com
  17. │       │       └── example
  18. │       │           └── AppTest.java
  19. │       └── resources        # 测试资源文件目录
  20. └── target                   # 构建输出目录(由Maven自动生成)
复制代码

3.1 pom.xml文件解析

pom.xml(Project Object Model)是Maven项目的核心配置文件,它包含了项目的基本信息、构建配置、依赖关系等。

以下是一个基本的pom.xml文件示例:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <!-- 项目基本信息 -->
  7.     <groupId>com.example</groupId>
  8.     <artifactId>my-app</artifactId>
  9.     <version>1.0-SNAPSHOT</version>
  10.     <packaging>jar</packaging>
  11.     <!-- 项目属性 -->
  12.     <properties>
  13.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14.         <maven.compiler.source>1.8</maven.compiler.source>
  15.         <maven.compiler.target>1.8</maven.compiler.target>
  16.     </properties>
  17.     <!-- 依赖管理 -->
  18.     <dependencies>
  19.         <dependency>
  20.             <groupId>junit</groupId>
  21.             <artifactId>junit</artifactId>
  22.             <version>4.13.2</version>
  23.             <scope>test</scope>
  24.         </dependency>
  25.     </dependencies>
  26.     <!-- 构建配置 -->
  27.     <build>
  28.         <plugins>
  29.             <plugin>
  30.                 <groupId>org.apache.maven.plugins</groupId>
  31.                 <artifactId>maven-compiler-plugin</artifactId>
  32.                 <version>3.8.1</version>
  33.                 <configuration>
  34.                     <source>1.8</source>
  35.                     <target>1.8</target>
  36.                 </configuration>
  37.             </plugin>
  38.         </plugins>
  39.     </build>
  40. </project>
复制代码

pom.xml文件的主要元素说明:

• modelVersion: 指定POM模型的版本,当前版本为4.0.0
• groupId: 项目组ID,通常是公司或组织域名的倒序
• artifactId: 项目ID,通常是项目名称
• version: 项目版本
• packaging: 项目打包类型,可以是jar、war、pom等
• properties: 项目属性,可以定义一些变量,在POM文件的其他地方引用
• dependencies: 项目依赖列表
• build: 构建配置,包括插件配置等

4. Maven依赖管理

4.1 添加依赖

在pom.xml文件中,可以通过dependencies元素添加项目依赖。每个依赖通过dependency元素定义,包含groupId、artifactId和version三个基本元素。

例如,添加Spring Boot Starter Web依赖:
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.springframework.boot</groupId>
  4.         <artifactId>spring-boot-starter-web</artifactId>
  5.         <version>2.7.5</version>
  6.     </dependency>
  7. </dependencies>
复制代码

4.2 依赖范围(Scope)

依赖范围用于控制依赖在不同阶段(编译、测试、运行)的可见性。常见的依赖范围有:

• compile: 默认范围,在编译、测试、运行阶段都可见
• provided: 在编译、测试阶段可见,但在运行阶段由容器提供(例如Servlet API)
• runtime: 在测试、运行阶段可见,但在编译阶段不可见(例如JDBC驱动)
• test: 只在测试阶段可见(例如JUnit)
• system: 类似于provided,但需要显式提供JAR文件,不推荐使用

示例:
  1. <dependency>
  2.     <groupId>javax.servlet</groupId>
  3.     <artifactId>javax.servlet-api</artifactId>
  4.     <version>4.0.1</version>
  5.     <scope>provided</scope>
  6. </dependency>
复制代码

4.3 依赖排除(Exclusions)

有时候,我们可能需要排除某个依赖传递引入的其他依赖。这可以通过exclusions元素实现。

示例:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-web</artifactId>
  4.     <version>2.7.5</version>
  5.     <exclusions>
  6.         <exclusion>
  7.             <groupId>org.springframework.boot</groupId>
  8.             <artifactId>spring-boot-starter-tomcat</artifactId>
  9.         </exclusion>
  10.     </exclusions>
  11. </dependency>
复制代码

4.4 依赖冲突解决

当项目中的多个依赖引入了同一个库的不同版本时,就会产生依赖冲突。Maven使用”最近定义策略”来解决依赖冲突,即使用POM中距离项目最近的依赖版本。

要查看依赖树,可以使用以下命令:
  1. mvn dependency:tree
复制代码

输出示例:
  1. [INFO] com.example:my-app:jar:1.0-SNAPSHOT
  2. [INFO] +- junit:junit:jar:4.13.2:test
  3. [INFO] \- org.springframework.boot:spring-boot-starter-web:jar:2.7.5:compile
  4. [INFO]    +- org.springframework.boot:spring-boot-starter:jar:2.7.5:compile
  5. [INFO]    |  +- org.springframework.boot:spring-boot:jar:2.7.5:compile
  6. [INFO]    |  +- org.springframework.boot:spring-boot-autoconfigure:jar:2.7.5:compile
  7. [INFO]    |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.7.5:compile
  8. [INFO]    |  |  +- ch.qos.logback:logback-classic:jar:1.2.11:compile
  9. [INFO]    |  |  |  \- ch.qos.logback:logback-core:jar:1.2.11:compile
  10. [INFO]    |  |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.17.2:compile
  11. [INFO]    |  |  |  \- org.apache.logging.log4j:log4j-api:jar:2.17.2:compile
  12. [INFO]    |  |  \- org.slf4j:jul-to-slf4j:jar:1.7.36:compile
  13. [INFO]    |  +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
  14. [INFO]    |  \- org.yaml:snakeyaml:jar:1.30:compile
  15. [INFO]    +- org.springframework.boot:spring-boot-starter-json:jar:2.7.5:compile
  16. [INFO]    |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.13.4.2:compile
  17. [INFO]    |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.13.4:compile
  18. [INFO]    |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.13.4:compile
  19. [INFO]    |  +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.13.4:compile
  20. [INFO]    |  +- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.13.4:compile
  21. [INFO]    |  \- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.13.4:compile
  22. [INFO]    +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.7.5:compile
  23. [INFO]    |  +- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.65:compile
  24. [INFO]    |  +- org.apache.tomcat.embed:tomcat-embed-el:jar:9.0.65:compile
  25. [INFO]    |  \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.65:compile
  26. [INFO]    +- org.springframework:spring-webmvc:jar:5.3.23:compile
  27. [INFO]    |  +- org.springframework:spring-aop:jar:5.3.23:compile
  28. [INFO]    |  +- org.springframework:spring-beans:jar:5.3.23:compile
  29. [INFO]    |  +- org.springframework:spring-context:jar:5.3.23:compile
  30. [INFO]    |  +- org.springframework:spring-core:jar:5.3.23:compile
  31. [INFO]    |  |  \- org.springframework:spring-jcl:jar:5.3.23:compile
  32. [INFO]    |  +- org.springframework:spring-expression:jar:5.3.23:compile
  33. [INFO]    |  \- org.springframework:spring-web:jar:5.3.23:compile
  34. [INFO]    \- org.springframework:spring-web:jar:5.3.23:compile
复制代码

如果需要手动解决依赖冲突,可以在pom.xml中显式指定要使用的版本:
  1. <dependency>
  2.     <groupId>com.fasterxml.jackson.core</groupId>
  3.     <artifactId>jackson-databind</artifactId>
  4.     <version>2.13.4.2</version>
  5. </dependency>
复制代码

4.5 依赖管理(Dependency Management)

在多模块项目中,为了统一管理依赖版本,可以使用dependencyManagement元素。它不会实际引入依赖,只是定义依赖的版本,子模块需要显式声明依赖但不指定版本。

示例:
  1. <dependencyManagement>
  2.     <dependencies>
  3.         <dependency>
  4.             <groupId>org.springframework.boot</groupId>
  5.             <artifactId>spring-boot-dependencies</artifactId>
  6.             <version>2.7.5</version>
  7.             <type>pom</type>
  8.             <scope>import</scope>
  9.         </dependency>
  10.         <dependency>
  11.             <groupId>org.projectlombok</groupId>
  12.             <artifactId>lombok</artifactId>
  13.             <version>1.18.24</version>
  14.         </dependency>
  15.     </dependencies>
  16. </dependencyManagement>
复制代码

然后在子模块中,可以不指定版本引入依赖:
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.projectlombok</groupId>
  4.         <artifactId>lombok</artifactId>
  5.         <scope>provided</scope>
  6.     </dependency>
  7. </dependencies>
复制代码

5. Maven构建生命周期

Maven的构建生命周期是一系列阶段的集合,用于定义项目的构建过程。Maven有三个内置的生命周期:clean、default和site。

5.1 Clean生命周期

Clean生命周期用于清理项目,包含三个阶段:

1. pre-clean: 执行清理前需要完成的工作
2. clean: 移除上一次构建生成的所有文件
3. post-clean: 执行清理后需要完成的工作

最常用的Clean生命周期命令是:
  1. mvn clean
复制代码

5.2 Default生命周期

Default生命周期是Maven的主要生命周期,用于构建和部署项目,包含以下主要阶段:

1. validate: 验证项目是否正确,所有必要信息是否可用
2. initialize: 初始化构建状态,例如设置属性
3. generate-sources: 生成任何需要的源代码
4. process-sources: 处理源代码,例如过滤值
5. generate-resources: 生成资源文件
6. process-resources: 复制并处理资源文件到目标目录
7. compile: 编译项目的源代码
8. process-classes: 处理编译生成的文件,例如字节码增强
9. generate-test-sources: 生成测试源代码
10. process-test-sources: 处理测试源代码
11. generate-test-resources: 生成测试资源文件
12. process-test-resources: 处理测试资源文件
13. test-compile: 编译测试源代码
14. process-test-classes: 处理测试编译生成的文件
15. test: 使用合适的单元测试框架运行测试
16. prepare-package: 在打包前需要完成的准备工作
17. package: 将编译后的代码打包成可发布的格式,如JAR
18. pre-integration-test: 在集成测试前需要完成的准备工作
19. integration-test: 处理并部署必要的包到集成测试环境中
20. post-integration-test: 执行集成测试后需要完成的工作
21. verify: 运行任何检查以验证包是否有效且符合质量标准
22. install: 将包安装到本地仓库,供本地其他项目使用
23. deploy: 将最终包复制到远程仓库,供其他开发者和项目共享

常用的Default生命周期命令有:
  1. mvn compile          # 编译项目
  2. mvn test             # 运行测试
  3. mvn package          # 打包项目
  4. mvn install          # 安装到本地仓库
  5. mvn deploy           # 部署到远程仓库
复制代码

5.3 Site生命周期

Site生命周期用于生成项目文档和站点,包含以下主要阶段:

1. pre-site: 在生成站点前需要完成的工作
2. site: 生成项目的站点文档
3. post-site: 在生成站点后需要完成的工作
4. site-deploy: 将生成的站点部署到服务器

常用的Site生命周期命令是:
  1. mvn site             # 生成项目站点
复制代码

5.4 生命周期阶段与插件目标的关系

Maven的生命周期阶段与插件目标是相关联的。每个生命周期阶段的执行实际上是调用绑定到该阶段的插件目标。例如,compile阶段绑定了maven-compiler-plugin的compile目标,package阶段绑定了maven-jar-plugin的jar目标。

可以通过在pom.xml中配置插件来自定义绑定:
  1. <build>
  2.     <plugins>
  3.         <plugin>
  4.             <groupId>org.apache.maven.plugins</groupId>
  5.             <artifactId>maven-antrun-plugin</artifactId>
  6.             <version>1.8</version>
  7.             <executions>
  8.                 <execution>
  9.                     <id>validate</id>
  10.                     <phase>validate</phase>
  11.                     <goals>
  12.                         <goal>run</goal>
  13.                     </goals>
  14.                     <configuration>
  15.                         <tasks>
  16.                             <echo>Validating project...</echo>
  17.                         </tasks>
  18.                     </configuration>
  19.                 </execution>
  20.             </executions>
  21.         </plugin>
  22.     </plugins>
  23. </build>
复制代码

6. 常用Maven插件

6.1 编译插件(maven-compiler-plugin)

maven-compiler-plugin用于编译Java源代码,是Maven的核心插件之一。
  1. <plugin>
  2.     <groupId>org.apache.maven.plugins</groupId>
  3.     <artifactId>maven-compiler-plugin</artifactId>
  4.     <version>3.8.1</version>
  5.     <configuration>
  6.         <source>1.8</source>           <!-- 源代码使用的Java版本 -->
  7.         <target>1.8</target>          <!-- 生成的目标Java版本 -->
  8.         <encoding>UTF-8</encoding>    <!-- 编译编码 -->
  9.         <compilerArgs>
  10.             <arg>-Xlint:all</arg>     <!-- 编译器参数 -->
  11.         </compilerArgs>
  12.     </configuration>
  13. </plugin>
复制代码

6.2 测试插件(maven-surefire-plugin)

maven-surefire-plugin用于运行单元测试,是Maven的默认测试插件。
  1. <plugin>
  2.     <groupId>org.apache.maven.plugins</groupId>
  3.     <artifactId>maven-surefire-plugin</artifactId>
  4.     <version>3.0.0-M5</version>
  5.     <configuration>
  6.         <includes>
  7.             <include>**/*Test.java</include>  <!-- 包含的测试文件模式 -->
  8.         </includes>
  9.         <excludes>
  10.             <exclude>**/*IT.java</exclude>    <!-- 排除的测试文件模式 -->
  11.         </excludes>
  12.         <skipTests>false</skipTests>          <!-- 是否跳过测试 -->
  13.         <testFailureIgnore>true</testFailureIgnore> <!-- 是否忽略测试失败 -->
  14.     </configuration>
  15. </plugin>
复制代码

6.3 打包插件(maven-jar-plugin)

maven-jar-plugin用于将编译后的代码打包成JAR文件。
  1. <plugin>
  2.     <groupId>org.apache.maven.plugins</groupId>
  3.     <artifactId>maven-jar-plugin</artifactId>
  4.     <version>3.2.0</version>
  5.     <configuration>
  6.         <archive>
  7.             <manifest>
  8.                 <addClasspath>true</addClasspath>  <!-- 添加类路径 -->
  9.                 <mainClass>com.example.App</mainClass> <!-- 主类 -->
  10.             </manifest>
  11.         </archive>
  12.     </configuration>
  13. </plugin>
复制代码

6.4 源码插件(maven-source-plugin)

maven-source-plugin用于创建项目的源码JAR包。
  1. <plugin>
  2.     <groupId>org.apache.maven.plugins</groupId>
  3.     <artifactId>maven-source-plugin</artifactId>
  4.     <version>3.2.1</version>
  5.     <executions>
  6.         <execution>
  7.             <id>attach-sources</id>
  8.             <goals>
  9.                 <goal>jar</goal>
  10.             </goals>
  11.         </execution>
  12.     </executions>
  13. </plugin>
复制代码

6.5 文档插件(maven-javadoc-plugin)

maven-javadoc-plugin用于生成项目的JavaDoc文档。
  1. <plugin>
  2.     <groupId>org.apache.maven.plugins</groupId>
  3.     <artifactId>maven-javadoc-plugin</artifactId>
  4.     <version>3.3.1</version>
  5.     <executions>
  6.         <execution>
  7.             <id>attach-javadocs</id>
  8.             <goals>
  9.                 <goal>jar</goal>
  10.             </goals>
  11.         </execution>
  12.     </executions>
  13.     <configuration>
  14.         <doclint>none</doclint>  <!-- 禁用doclint检查 -->
  15.     </configuration>
  16. </plugin>
复制代码

6.6 Spring Boot插件(spring-boot-maven-plugin)

如果你使用Spring Boot,spring-boot-maven-plugin是必不可少的,它用于创建可执行的JAR包。
  1. <plugin>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-maven-plugin</artifactId>
  4.     <version>2.7.5</version>
  5.     <executions>
  6.         <execution>
  7.             <goals>
  8.                 <goal>repackage</goal>
  9.             </goals>
  10.         </execution>
  11.     </executions>
  12. </plugin>
复制代码

6.7 Tomcat插件(tomcat7-maven-plugin)

tomcat7-maven-plugin用于在开发过程中快速部署和运行Web应用。
  1. <plugin>
  2.     <groupId>org.apache.tomcat.maven</groupId>
  3.     <artifactId>tomcat7-maven-plugin</artifactId>
  4.     <version>2.2</version>
  5.     <configuration>
  6.         <port>8080</port>              <!-- Tomcat端口 -->
  7.         <path>/</path>                <!-- 应用上下文路径 -->
  8.         <uriEncoding>UTF-8</uriEncoding> <!-- URI编码 -->
  9.     </configuration>
  10. </plugin>
复制代码

使用此插件运行Web应用的命令:
  1. mvn tomcat7:run
复制代码

7. 实战案例分析

7.1 创建一个Spring Boot Web项目

让我们通过一个完整的实战案例来学习如何使用Maven创建和管理一个Spring Boot Web项目。

首先,使用命令行创建一个新的Maven项目:
  1. mvn archetype:generate -DgroupId=com.example -DartifactId=springboot-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
复制代码

进入项目目录,修改pom.xml文件,添加Spring Boot相关依赖和插件:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>com.example</groupId>
  7.     <artifactId>springboot-demo</artifactId>
  8.     <version>1.0-SNAPSHOT</version>
  9.     <packaging>jar</packaging>
  10.     <name>springboot-demo</name>
  11.     <description>Spring Boot Demo Project</description>
  12.     <!-- 继承Spring Boot父项目 -->
  13.     <parent>
  14.         <groupId>org.springframework.boot</groupId>
  15.         <artifactId>spring-boot-starter-parent</artifactId>
  16.         <version>2.7.5</version>
  17.         <relativePath/>
  18.     </parent>
  19.     <properties>
  20.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  21.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  22.         <java.version>1.8</java.version>
  23.     </properties>
  24.     <dependencies>
  25.         <!-- Spring Boot Web启动器 -->
  26.         <dependency>
  27.             <groupId>org.springframework.boot</groupId>
  28.             <artifactId>spring-boot-starter-web</artifactId>
  29.         </dependency>
  30.         
  31.         <!-- Spring Boot Data JPA启动器 -->
  32.         <dependency>
  33.             <groupId>org.springframework.boot</groupId>
  34.             <artifactId>spring-boot-starter-data-jpa</artifactId>
  35.         </dependency>
  36.         
  37.         <!-- H2内存数据库 -->
  38.         <dependency>
  39.             <groupId>com.h2database</groupId>
  40.             <artifactId>h2</artifactId>
  41.             <scope>runtime</scope>
  42.         </dependency>
  43.         
  44.         <!-- Lombok -->
  45.         <dependency>
  46.             <groupId>org.projectlombok</groupId>
  47.             <artifactId>lombok</artifactId>
  48.             <optional>true</optional>
  49.         </dependency>
  50.         
  51.         <!-- Spring Boot Test启动器 -->
  52.         <dependency>
  53.             <groupId>org.springframework.boot</groupId>
  54.             <artifactId>spring-boot-starter-test</artifactId>
  55.             <scope>test</scope>
  56.         </dependency>
  57.     </dependencies>
  58.     <build>
  59.         <plugins>
  60.             <!-- Spring Boot插件 -->
  61.             <plugin>
  62.                 <groupId>org.springframework.boot</groupId>
  63.                 <artifactId>spring-boot-maven-plugin</artifactId>
  64.                 <configuration>
  65.                     <excludes>
  66.                         <exclude>
  67.                             <groupId>org.projectlombok</groupId>
  68.                             <artifactId>lombok</artifactId>
  69.                         </exclude>
  70.                     </excludes>
  71.                 </configuration>
  72.             </plugin>
  73.         </plugins>
  74.     </build>
  75. </project>
复制代码

在src/main/java目录下创建以下包结构:
  1. com.example.springbootdemo
  2. ├── controller        # 控制器层
  3. ├── service           # 服务层
  4. ├── repository        # 数据访问层
  5. ├── model             # 实体类
  6. └── SpringbootDemoApplication.java  # 应用程序入口类
复制代码

在model包中创建User实体类:
  1. package com.example.springbootdemo.model;
  2. import lombok.Data;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. @Data
  8. @Entity
  9. public class User {
  10.     @Id
  11.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  12.     private Long id;
  13.    
  14.     private String name;
  15.    
  16.     private String email;
  17. }
复制代码

在repository包中创建UserRepository接口:
  1. package com.example.springbootdemo.repository;
  2. import com.example.springbootdemo.model.User;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public interface UserRepository extends JpaRepository<User, Long> {
  7. }
复制代码

在service包中创建UserService接口和实现类:
  1. package com.example.springbootdemo.service;
  2. import com.example.springbootdemo.model.User;
  3. import java.util.List;
  4. public interface UserService {
  5.     User saveUser(User user);
  6.    
  7.     User getUserById(Long id);
  8.    
  9.     List<User> getAllUsers();
  10.    
  11.     void deleteUser(Long id);
  12. }
复制代码
  1. package com.example.springbootdemo.service;
  2. import com.example.springbootdemo.model.User;
  3. import com.example.springbootdemo.repository.UserRepository;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import java.util.List;
  7. @Service
  8. public class UserServiceImpl implements UserService {
  9.    
  10.     @Autowired
  11.     private UserRepository userRepository;
  12.    
  13.     @Override
  14.     public User saveUser(User user) {
  15.         return userRepository.save(user);
  16.     }
  17.    
  18.     @Override
  19.     public User getUserById(Long id) {
  20.         return userRepository.findById(id).orElse(null);
  21.     }
  22.    
  23.     @Override
  24.     public List<User> getAllUsers() {
  25.         return userRepository.findAll();
  26.     }
  27.    
  28.     @Override
  29.     public void deleteUser(Long id) {
  30.         userRepository.deleteById(id);
  31.     }
  32. }
复制代码

在controller包中创建UserController类:
  1. package com.example.springbootdemo.controller;
  2. import com.example.springbootdemo.model.User;
  3. import com.example.springbootdemo.service.UserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.http.ResponseEntity;
  6. import org.springframework.web.bind.annotation.*;
  7. import java.util.List;
  8. @RestController
  9. @RequestMapping("/api/users")
  10. public class UserController {
  11.    
  12.     @Autowired
  13.     private UserService userService;
  14.    
  15.     @PostMapping
  16.     public User createUser(@RequestBody User user) {
  17.         return userService.saveUser(user);
  18.     }
  19.    
  20.     @GetMapping("/{id}")
  21.     public ResponseEntity<User> getUserById(@PathVariable Long id) {
  22.         User user = userService.getUserById(id);
  23.         if (user == null) {
  24.             return ResponseEntity.notFound().build();
  25.         }
  26.         return ResponseEntity.ok(user);
  27.     }
  28.    
  29.     @GetMapping
  30.     public List<User> getAllUsers() {
  31.         return userService.getAllUsers();
  32.     }
  33.    
  34.     @DeleteMapping("/{id}")
  35.     public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
  36.         userService.deleteUser(id);
  37.         return ResponseEntity.noContent().build();
  38.     }
  39. }
复制代码

在根包中创建SpringbootDemoApplication类:
  1. package com.example.springbootdemo;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class SpringbootDemoApplication {
  6.     public static void main(String[] args) {
  7.         SpringApplication.run(SpringbootDemoApplication.class, args);
  8.     }
  9. }
复制代码

在src/main/resources目录下创建application.properties文件:
  1. # 服务器端口配置
  2. server.port=8080
  3. # H2数据库配置
  4. spring.h2.console.enabled=true
  5. spring.h2.console.path=/h2-console
  6. # JPA配置
  7. spring.jpa.hibernate.ddl-auto=update
  8. spring.jpa.show-sql=true
  9. spring.jpa.properties.hibernate.format_sql=true
复制代码

使用Maven命令运行应用程序:
  1. mvn spring-boot:run
复制代码

或者先构建再运行:
  1. mvn clean package
  2. java -jar target/springboot-demo-1.0-SNAPSHOT.jar
复制代码

应用程序启动后,可以使用Postman或curl工具测试API:

1. 创建用户:
  1. curl -X POST http://localhost:8080/api/users \
  2. -H "Content-Type: application/json" \
  3. -d '{"name": "John Doe", "email": "john@example.com"}'
复制代码

1. 获取所有用户:
  1. curl http://localhost:8080/api/users
复制代码

1. 根据ID获取用户:
  1. curl http://localhost:8080/api/users/1
复制代码

1. 删除用户:
  1. curl -X DELETE http://localhost:8080/api/users/1
复制代码

1. 访问H2控制台:

打开浏览器,访问http://localhost:8080/h2-console

JDBC URL:jdbc:h2:mem:testdbUser Name:saPassword: 留空

7.2 多模块项目示例

在企业级开发中,通常会将一个复杂的项目拆分为多个模块。下面我们创建一个包含三个模块的多模块项目:common(公共模块)、service(服务模块)和web(Web模块)。

首先,创建父项目:
  1. mvn archetype:generate -DgroupId=com.example -DartifactId=maven-multimodule-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
复制代码

修改父项目的pom.xml文件:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>com.example</groupId>
  7.     <artifactId>maven-multimodule-demo</artifactId>
  8.     <version>1.0-SNAPSHOT</version>
  9.     <packaging>pom</packaging>
  10.     <name>maven-multimodule-demo</name>
  11.     <description>Maven Multi-Module Demo Project</description>
  12.     <properties>
  13.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14.         <maven.compiler.source>1.8</maven.compiler.source>
  15.         <maven.compiler.target>1.8</maven.compiler.target>
  16.         <spring.boot.version>2.7.5</spring.boot.version>
  17.     </properties>
  18.     <modules>
  19.         <module>common</module>
  20.         <module>service</module>
  21.         <module>web</module>
  22.     </modules>
  23.     <dependencyManagement>
  24.         <dependencies>
  25.             <dependency>
  26.                 <groupId>org.springframework.boot</groupId>
  27.                 <artifactId>spring-boot-dependencies</artifactId>
  28.                 <version>${spring.boot.version}</version>
  29.                 <type>pom</type>
  30.                 <scope>import</scope>
  31.             </dependency>
  32.             <dependency>
  33.                 <groupId>com.example</groupId>
  34.                 <artifactId>common</artifactId>
  35.                 <version>${project.version}</version>
  36.             </dependency>
  37.             <dependency>
  38.                 <groupId>com.example</groupId>
  39.                 <artifactId>service</artifactId>
  40.                 <version>${project.version}</version>
  41.             </dependency>
  42.         </dependencies>
  43.     </dependencyManagement>
  44.     <build>
  45.         <plugins>
  46.             <plugin>
  47.                 <groupId>org.apache.maven.plugins</groupId>
  48.                 <artifactId>maven-compiler-plugin</artifactId>
  49.                 <version>3.8.1</version>
  50.                 <configuration>
  51.                     <source>1.8</source>
  52.                     <target>1.8</target>
  53.                 </configuration>
  54.             </plugin>
  55.         </plugins>
  56.     </build>
  57. </project>
复制代码

在父项目目录下创建common模块:
  1. cd maven-multimodule-demo
  2. mvn archetype:generate -DgroupId=com.example -DartifactId=common -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
复制代码

修改common模块的pom.xml文件:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <parent>
  6.         <artifactId>maven-multimodule-demo</artifactId>
  7.         <groupId>com.example</groupId>
  8.         <version>1.0-SNAPSHOT</version>
  9.     </parent>
  10.     <modelVersion>4.0.0</modelVersion>
  11.     <artifactId>common</artifactId>
  12.     <name>common</name>
  13.     <description>Common Module</description>
  14.     <dependencies>
  15.         <dependency>
  16.             <groupId>org.projectlombok</groupId>
  17.             <artifactId>lombok</artifactId>
  18.             <optional>true</optional>
  19.         </dependency>
  20.     </dependencies>
  21. </project>
复制代码

在common模块中创建一个工具类:
  1. package com.example.common.utils;
  2. import lombok.extern.slf4j.Slf4j;
  3. @Slf4j
  4. public class StringUtils {
  5.    
  6.     public static boolean isEmpty(String str) {
  7.         return str == null || str.trim().length() == 0;
  8.     }
  9.    
  10.     public static boolean isNotEmpty(String str) {
  11.         return !isEmpty(str);
  12.     }
  13.    
  14.     public static String reverse(String str) {
  15.         if (isEmpty(str)) {
  16.             return str;
  17.         }
  18.         return new StringBuilder(str).reverse().toString();
  19.     }
  20. }
复制代码

在父项目目录下创建service模块:
  1. mvn archetype:generate -DgroupId=com.example -DartifactId=service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
复制代码

修改service模块的pom.xml文件:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <parent>
  6.         <artifactId>maven-multimodule-demo</artifactId>
  7.         <groupId>com.example</groupId>
  8.         <version>1.0-SNAPSHOT</version>
  9.     </parent>
  10.     <modelVersion>4.0.0</modelVersion>
  11.     <artifactId>service</artifactId>
  12.     <name>service</name>
  13.     <description>Service Module</description>
  14.     <dependencies>
  15.         <dependency>
  16.             <groupId>com.example</groupId>
  17.             <artifactId>common</artifactId>
  18.         </dependency>
  19.         <dependency>
  20.             <groupId>org.springframework.boot</groupId>
  21.             <artifactId>spring-boot-starter-data-jpa</artifactId>
  22.         </dependency>
  23.         <dependency>
  24.             <groupId>com.h2database</groupId>
  25.             <artifactId>h2</artifactId>
  26.             <scope>runtime</scope>
  27.         </dependency>
  28.     </dependencies>
  29. </project>
复制代码

在service模块中创建实体类、仓库接口和服务类:
  1. // 实体类
  2. package com.example.service.model;
  3. import com.example.common.utils.StringUtils;
  4. import lombok.Data;
  5. import javax.persistence.Entity;
  6. import javax.persistence.GeneratedValue;
  7. import javax.persistence.GenerationType;
  8. import javax.persistence.Id;
  9. @Data
  10. @Entity
  11. public class Product {
  12.     @Id
  13.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  14.     private Long id;
  15.    
  16.     private String name;
  17.    
  18.     private String description;
  19.    
  20.     private Double price;
  21.    
  22.     public String getDisplayName() {
  23.         return StringUtils.isEmpty(description) ? name : name + " - " + description;
  24.     }
  25. }
复制代码
  1. // 仓库接口
  2. package com.example.service.repository;
  3. import com.example.service.model.Product;
  4. import org.springframework.data.jpa.repository.JpaRepository;
  5. import org.springframework.stereotype.Repository;
  6. @Repository
  7. public interface ProductRepository extends JpaRepository<Product, Long> {
  8. }
复制代码
  1. // 服务接口
  2. package com.example.service;
  3. import com.example.service.model.Product;
  4. import java.util.List;
  5. public interface ProductService {
  6.     Product saveProduct(Product product);
  7.    
  8.     Product getProductById(Long id);
  9.    
  10.     List<Product> getAllProducts();
  11.    
  12.     void deleteProduct(Long id);
  13. }
复制代码
  1. // 服务实现类
  2. package com.example.service;
  3. import com.example.service.model.Product;
  4. import com.example.service.repository.ProductRepository;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import java.util.List;
  8. @Service
  9. public class ProductServiceImpl implements ProductService {
  10.    
  11.     @Autowired
  12.     private ProductRepository productRepository;
  13.    
  14.     @Override
  15.     public Product saveProduct(Product product) {
  16.         return productRepository.save(product);
  17.     }
  18.    
  19.     @Override
  20.     public Product getProductById(Long id) {
  21.         return productRepository.findById(id).orElse(null);
  22.     }
  23.    
  24.     @Override
  25.     public List<Product> getAllProducts() {
  26.         return productRepository.findAll();
  27.     }
  28.    
  29.     @Override
  30.     public void deleteProduct(Long id) {
  31.         productRepository.deleteById(id);
  32.     }
  33. }
复制代码

在父项目目录下创建web模块:
  1. mvn archetype:generate -DgroupId=com.example -DartifactId=web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
复制代码

修改web模块的pom.xml文件:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <parent>
  6.         <artifactId>maven-multimodule-demo</artifactId>
  7.         <groupId>com.example</groupId>
  8.         <version>1.0-SNAPSHOT</version>
  9.     </parent>
  10.     <modelVersion>4.0.0</modelVersion>
  11.     <artifactId>web</artifactId>
  12.     <packaging>war</packaging>
  13.     <name>web</name>
  14.     <description>Web Module</description>
  15.     <dependencies>
  16.         <dependency>
  17.             <groupId>com.example</groupId>
  18.             <artifactId>common</artifactId>
  19.         </dependency>
  20.         <dependency>
  21.             <groupId>com.example</groupId>
  22.             <artifactId>service</artifactId>
  23.         </dependency>
  24.         <dependency>
  25.             <groupId>org.springframework.boot</groupId>
  26.             <artifactId>spring-boot-starter-web</artifactId>
  27.         </dependency>
  28.         <dependency>
  29.             <groupId>org.springframework.boot</groupId>
  30.             <artifactId>spring-boot-starter-tomcat</artifactId>
  31.             <scope>provided</scope>
  32.         </dependency>
  33.     </dependencies>
  34.     <build>
  35.         <plugins>
  36.             <plugin>
  37.                 <groupId>org.springframework.boot</groupId>
  38.                 <artifactId>spring-boot-maven-plugin</artifactId>
  39.             </plugin>
  40.         </plugins>
  41.     </build>
  42. </project>
复制代码

在web模块中创建应用程序入口类和控制器:
  1. // 应用程序入口类
  2. package com.example.web;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.boot.builder.SpringApplicationBuilder;
  6. import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
  7. @SpringBootApplication
  8. public class WebApplication extends SpringBootServletInitializer {
  9.    
  10.     public static void main(String[] args) {
  11.         SpringApplication.run(WebApplication.class, args);
  12.     }
  13.    
  14.     @Override
  15.     protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
  16.         return builder.sources(WebApplication.class);
  17.     }
  18. }
复制代码
  1. // 控制器
  2. package com.example.web.controller;
  3. import com.example.service.model.Product;
  4. import com.example.service.ProductService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.http.ResponseEntity;
  7. import org.springframework.web.bind.annotation.*;
  8. import java.util.List;
  9. @RestController
  10. @RequestMapping("/api/products")
  11. public class ProductController {
  12.    
  13.     @Autowired
  14.     private ProductService productService;
  15.    
  16.     @PostMapping
  17.     public Product createProduct(@RequestBody Product product) {
  18.         return productService.saveProduct(product);
  19.     }
  20.    
  21.     @GetMapping("/{id}")
  22.     public ResponseEntity<Product> getProductById(@PathVariable Long id) {
  23.         Product product = productService.getProductById(id);
  24.         if (product == null) {
  25.             return ResponseEntity.notFound().build();
  26.         }
  27.         return ResponseEntity.ok(product);
  28.     }
  29.    
  30.     @GetMapping
  31.     public List<Product> getAllProducts() {
  32.         return productService.getAllProducts();
  33.     }
  34.    
  35.     @DeleteMapping("/{id}")
  36.     public ResponseEntity<Void> deleteProduct(@PathVariable Long id) {
  37.         productService.deleteProduct(id);
  38.         return ResponseEntity.noContent().build();
  39.     }
  40. }
复制代码

在src/main/resources目录下创建application.properties文件:
  1. # 服务器端口配置
  2. server.port=8080
  3. # H2数据库配置
  4. spring.h2.console.enabled=true
  5. spring.h2.console.path=/h2-console
  6. # JPA配置
  7. spring.jpa.hibernate.ddl-auto=update
  8. spring.jpa.show-sql=true
  9. spring.jpa.properties.hibernate.format_sql=true
复制代码

在父项目目录下执行以下命令构建整个项目:
  1. mvn clean package
复制代码

运行Web模块:
  1. cd web
  2. mvn spring-boot:run
复制代码

或者使用Java命令运行:
  1. java -jar web/target/web-1.0-SNAPSHOT.war
复制代码

应用程序启动后,可以使用Postman或curl工具测试API:

1. 创建产品:
  1. curl -X POST http://localhost:8080/api/products \
  2. -H "Content-Type: application/json" \
  3. -d '{"name": "Laptop", "description": "High performance laptop", "price": 999.99}'
复制代码

1. 获取所有产品:
  1. curl http://localhost:8080/api/products
复制代码

1. 根据ID获取产品:
  1. curl http://localhost:8080/api/products/1
复制代码

1. 删除产品:
  1. curl -X DELETE http://localhost:8080/api/products/1
复制代码

8. 最佳实践与常见问题解决

8.1 Maven最佳实践

Maven强调”约定优于配置”的原则,尽量遵循Maven的默认目录结构和命名约定,这样可以减少配置,提高项目的可维护性。

在pom.xml中使用properties元素定义依赖版本号,这样可以集中管理版本,便于升级和维护。
  1. <properties>
  2.     <spring.boot.version>2.7.5</spring.boot.version>
  3.     <mysql.connector.version>8.0.30</mysql.connector.version>
  4. </properties>
  5. <dependencies>
  6.     <dependency>
  7.         <groupId>org.springframework.boot</groupId>
  8.         <artifactId>spring-boot-starter-web</artifactId>
  9.         <version>${spring.boot.version}</version>
  10.     </dependency>
  11.     <dependency>
  12.         <groupId>mysql</groupId>
  13.         <artifactId>mysql-connector-java</artifactId>
  14.         <version>${mysql.connector.version}</version>
  15.     </dependency>
  16. </dependencies>
复制代码

在多模块项目中,使用dependencyManagement元素统一管理依赖版本,确保各模块使用一致的依赖版本。
  1. <dependencyManagement>
  2.     <dependencies>
  3.         <dependency>
  4.             <groupId>org.springframework.boot</groupId>
  5.             <artifactId>spring-boot-dependencies</artifactId>
  6.             <version>2.7.5</version>
  7.             <type>pom</type>
  8.             <scope>import</scope>
  9.         </dependency>
  10.     </dependencies>
  11. </dependencyManagement>
复制代码

根据依赖的用途,合理设置依赖范围(scope),避免不必要的依赖被打包到最终产品中。
  1. <dependency>
  2.     <groupId>junit</groupId>
  3.     <artifactId>junit</artifactId>
  4.     <version>4.13.2</version>
  5.     <scope>test</scope>
  6. </dependency>
复制代码

与依赖管理类似,使用pluginManagement元素统一管理插件版本。
  1. <build>
  2.     <pluginManagement>
  3.         <plugins>
  4.             <plugin>
  5.                 <groupId>org.apache.maven.plugins</groupId>
  6.                 <artifactId>maven-compiler-plugin</artifactId>
  7.                 <version>3.8.1</version>
  8.                 <configuration>
  9.                     <source>1.8</source>
  10.                     <target>1.8</target>
  11.                 </configuration>
  12.             </plugin>
  13.         </plugins>
  14.     </pluginManagement>
  15. </build>
复制代码

在pom.xml中配置资源过滤,可以在构建过程中动态替换资源文件中的变量。
  1. <build>
  2.     <resources>
  3.         <resource>
  4.             <directory>src/main/resources</directory>
  5.             <filtering>true</filtering>
  6.         </resource>
  7.     </resources>
  8. </build>
复制代码

然后在资源文件中使用${variable}语法引用变量:
  1. # application.properties
  2. app.name=${project.name}
  3. app.version=${project.version}
复制代码

使用Maven Profiles可以针对不同环境(开发、测试、生产等)使用不同的配置。
  1. <profiles>
  2.     <profile>
  3.         <id>dev</id>
  4.         <activation>
  5.             <activeByDefault>true</activeByDefault>
  6.         </activation>
  7.         <properties>
  8.             <environment>dev</environment>
  9.         </properties>
  10.     </profile>
  11.     <profile>
  12.         <id>prod</id>
  13.         <properties>
  14.             <environment>prod</environment>
  15.         </properties>
  16.     </profile>
  17. </profiles>
复制代码

使用特定Profile构建项目:
  1. mvn clean package -Pprod
复制代码

8.2 常见问题解决

问题:Maven无法从中央仓库下载依赖。

解决方案:

1. 检查网络连接和代理设置。
2. 配置国内镜像,例如阿里云镜像:
  1. <mirrors>
  2.     <mirror>
  3.         <id>aliyunmaven</id>
  4.         <mirrorOf>*</mirrorOf>
  5.         <name>阿里云公共仓库</name>
  6.         <url>https://maven.aliyun.com/repository/public</url>
  7.     </mirror>
  8. </mirrors>
复制代码

1. 清理本地仓库并重新下载:
  1. mvn clean install -U
复制代码

问题:项目中存在多个版本的同一依赖,导致运行时错误。

解决方案:

1. 使用依赖树命令查看依赖关系:
  1. mvn dependency:tree
复制代码

1. 使用dependencyManagement统一管理依赖版本。
2. 使用exclusions排除不需要的依赖:
  1. <dependency>
  2.     <groupId>com.example</groupId>
  3.     <artifactId>example-library</artifactId>
  4.     <version>1.0.0</version>
  5.     <exclusions>
  6.         <exclusion>
  7.             <groupId>org.slf4j</groupId>
  8.             <artifactId>slf4j-log4j12</artifactId>
  9.         </exclusion>
  10.     </exclusions>
  11. </dependency>
复制代码

问题:Maven编译Java代码时出现错误。

解决方案:

1. 检查Java版本是否一致,确保maven.compiler.source和maven.compiler.target与项目使用的Java版本一致。
2. 检查代码中是否有语法错误。
3. 增加编译器的详细输出:
  1. mvn clean compile -X
复制代码

问题:Maven运行测试时失败。

解决方案:

1. 查看测试失败的具体原因。
2. 运行特定的测试类:
  1. mvn test -Dtest=MyTestClass
复制代码

1. 跳过测试:
  1. mvn package -DskipTests
复制代码

问题:Maven构建项目速度很慢。

解决方案:

1. 配置国内镜像加速依赖下载。
2. 使用并行构建:
  1. mvn -T 4 clean package
复制代码

1. 使用Maven构建缓存:
  1. mvn clean package -Dmaven.repo.local=$HOME/.m2/repository
复制代码

1. 增加Maven内存:
  1. export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512m"
  2. mvn clean package
复制代码

问题:Maven插件执行失败。

解决方案:

1. 检查插件版本是否兼容。
2. 查看插件执行的详细日志:
  1. mvn clean package -X
复制代码

1. 跳过特定插件的执行:
  1. mvn clean package -Dmaven.javadoc.skip=true
复制代码

9. 总结与进阶学习资源

9.1 总结

本教程全面介绍了Maven的使用,从环境搭建到项目创建,再到依赖管理和构建过程,并通过两个实战案例(单模块Spring Boot项目和多模块企业项目)展示了Maven在实际开发中的应用。

通过本教程,你应该已经掌握了:

1. Maven环境的搭建与配置
2. Maven项目的创建与标准目录结构
3. Maven依赖管理,包括依赖声明、范围、冲突解决等
4. Maven构建生命周期与常用插件
5. 使用Maven构建Spring Boot项目
6. 使用Maven构建多模块企业项目
7. Maven最佳实践与常见问题解决

Maven作为Java项目管理的标准工具,掌握其使用对于Java开发者来说至关重要。通过合理使用Maven,可以大大提高项目构建和管理的效率,减少人为错误,使项目更加规范和易于维护。

9.2 进阶学习资源

如果你想进一步学习Maven,以下资源可能会有所帮助:

1. 官方文档:Maven官方网站Maven官方文档
2. Maven官方网站
3. Maven官方文档
4. 书籍:《Maven实战》《Java构建工具:Maven权威指南》
5. 《Maven实战》
6. 《Java构建工具:Maven权威指南》
7. 在线教程:Baeldung Maven教程W3Schools Maven教程
8. Baeldung Maven教程
9. W3Schools Maven教程
10. 视频教程:YouTube Maven教程B站Maven教程
11. YouTube Maven教程
12. B站Maven教程
13. 高级主题:Maven插件开发Maven Archetype开发Maven与CI/CD集成(如Jenkins、GitHub Actions等)Maven与Docker集成
14. Maven插件开发
15. Maven Archetype开发
16. Maven与CI/CD集成(如Jenkins、GitHub Actions等)
17. Maven与Docker集成

官方文档:

• Maven官方网站
• Maven官方文档

书籍:

• 《Maven实战》
• 《Java构建工具:Maven权威指南》

在线教程:

• Baeldung Maven教程
• W3Schools Maven教程

视频教程:

• YouTube Maven教程
• B站Maven教程

高级主题:

• Maven插件开发
• Maven Archetype开发
• Maven与CI/CD集成(如Jenkins、GitHub Actions等)
• Maven与Docker集成

通过不断学习和实践,你将能够更加熟练地使用Maven,为你的Java开发工作带来更高的效率和更好的体验。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.