Maven常用知识总结
- [Maven 安装与配置](#Maven 安装与配置)
-
- [windows mvn安装与配置](#windows mvn安装与配置)
- [IntelliJ IDEA 配置](#IntelliJ IDEA 配置)
-
- [IntelliJ IDEA 配置系统maven](#IntelliJ IDEA 配置系统maven)
- [Intellij IDEA Maven使用](#Intellij IDEA Maven使用)
- [IntelliJ IDEA 不能运行项目常见问题](#IntelliJ IDEA 不能运行项目常见问题)
- [pom.xml 常用标签讲解](#pom.xml 常用标签讲解)
-
- parent
- [groupId artifactId version](#groupId artifactId version)
- dependency
- properties
- plugin
- packaging
- dependencyManagement
- scope
- optional
- exclusion
- [mvn 常用命令](#mvn 常用命令)
- 常用maven插件
-
- maven-javadoc-plugin
- maven-compiler-plugin
- [maven-war-plugin maven-jar-plugin](#maven-war-plugin maven-jar-plugin)
- 多模块项目演示
- Maven多模块优势
- 参考内容
IDE集成开发环境对Maven进行了封装. 极度简化,只要很少了解Maven即可. 最近需要将tony/RuoYi-flowable迁移到Spring Boot 3, 系统学习了Maven,对常用内容进行了简单总结.
本篇主要讲解注意事项, 操作上存在部分步骤缺失.
Maven 安装与配置
windows mvn安装与配置
Maven 依赖于Java 环境, 注意配置JAVA_HOME 系统环境变量.
同时添加系统环境变量MAVEN_HOME指向maven安装路径.
对仓库进行配置
D:\Maven\mvn3.8.1\conf\settings.xml 配置本地仓库位置和阿里云镜像
<localRepository>D:/Maven/repo</localRepository>
...
<mirror>
<id>aliyun</id>
<name>Aliyun Maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
配置创建项目、模块的默认语言级别为17
<profiles>
<profile>
<id>development</id>
<activation>
<jdk>17</jdk>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
</profile>


手动修改还会进行警告: 模块'untitled3'从Maven导入。对其配置做出的任何更改在重新导入后可能丢失。
IntelliJ IDEA 配置
IntelliJ IDEA 配置系统maven
File ->Setting->Build Execution Deployment -> BuildTools -> Maven
ps. 不能彻底修改, 每次创建项目都要设置一次.
不配置阿里云,可能会出现如下连接超时的问题.
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.14.1 failed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.14.1 from/to central (https://repo.maven.apache.org/maven2): Connect to repo.maven.apache.org:443 [repo.maven.apache.org/151.101.88.215] failed: Connect timed out
Intellij IDEA Maven使用

从左到右依次为: 同步项目 执行命令 分析依赖关系 显示图
最左侧 图标 同步项目, 中间为执行mvn命令 右侧为 查看模块依赖关系
同步项目: 由于网络异常关闭等造成maven依赖没有下载完整, 点击该按钮实现重新下载
执行mvn命令: 弹出框 进行mvn命令的选择或输入
分析依赖关系
切换模块, 查看不同模块的依赖情况.

显示图

IntelliJ IDEA 不能运行项目常见问题
使用 IDEA导入maven项目后不能运行, 主要是jdk配置问题.
文件 -> 项目结构 修改项目\模块\平台SDK jdk版本

文件 -> 设置 -> 构建 执行 部署 -> 编译器 -> Java编译器 修改项目和模块字节码版本
pom.xml 常用标签讲解
parent
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.8.9</version>
</parent>
通过parent 子项目共享父项目pom.xml配置.
groupId artifactId version
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.5</version>
</dependency>
groupId(组标识符)通常采用 反向域名规则(类似 Java 包命名)
artifactId(项目标识符)标识项目的唯一名称,通常是项目或模块的简短名称
version(版本号)
三者合起来称为依赖坐标.
dependency
<dependencies>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
dependency 自动管理其需要的依赖
properties
<properties>
<java.version>17</java.version>
<spring-boot.version>3.3.5</spring-boot.version>
</properties>
指定工程的版本配置信息,除了可以手动引用外, 也存在父pom自动引入.
plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.songlili.hellospringboot2m.Hellospringboot2mApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
扩展和定制Maven构建过程.
maven-compiler-plugin:指定 Java 编译版本为 17,编码为 UTF-8。
spring-boot-maven-plugin:配置 Spring Boot 打包插件,指定主类为 Hellospringboot2mApplication,跳过打包并执行 repackage 目标。
packaging
<packaging>jar</packaging>
jar\war:指定打包形式
pom: 表示这是一个 Maven 项目对象模型(POM)文件,用于定义项目依赖、构建配置等信息
dependencyManagement
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.5</version>
</dependency>
</dependencyManagement>
定义在顶层项目中, 对整个项目进行版本统一管理. 子pom 引入依赖时, 不需要指定版本.
子pom.xml
<dependencies>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</dependency>
</dependencies>
当然, 子模块需要其他版本, 可以自定义version.
如果父 POM 直接在 (非 )中声明 jarA,则所有子模块会强制继承该依赖和版本. 子模块无法覆盖版本,除非使用 排除父依赖后重新声明。
ps: 如果dependencyManagement.dependencies 添加依赖莫名报错, 可以尝试 将dependency在(非 )进行声明并进行Maven同步. 然后再去掉.
scope
dependencies.dependency 添加scope. scope默认值为compile.
scope | 编译阶段 | 测试阶段 | 运行阶段 |
---|---|---|---|
compile | 可用 | 可用 | 可用 |
provided | 可用 | 可用 | 不 |
runtime | 不 | 不 | 可用 |
test | 不 | 可用 | 不 |
optional
dependencies.dependency.optional 指定依赖是否可以传递
moduleA
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
<optional>true</optional>
</dependency>
moduleB
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>moduleA</artifactId>
</dependency>
moduleB 依赖 moduleA, 不能获取 gson 依赖. new Gson() 提示无法导入.
moduleC
<parent>
<artifactId>moduleA</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.8.9</version>
</parent>
moduleC new Gson() 就可以实现对Gson导入.
exclusion
<!-- Swagger3依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
引入 springfox-boot-starter,用于支持 Swagger3 接口文档的自动生成;
排除 io.swagger:swagger-models,避免版本冲突或使用自定义版本。
mvn 常用命令
mvn clean # 清理生成的target.
mvn compile # 将源代码编译成可执行文件 .class
mvn test # 执行 test
mvn install # 打包后安装到本地仓库.
mvn clean package # 清理变红重新打包
mvn dependency:tree # 查看依赖树
mvn dependency:list # 查看依赖列表
test编写
test 添加依赖
<dependencies>
<dependency>
<groupId>name.remal.tools.test</groupId>
<artifactId>junit5</artifactId>
<version>1.26.147</version>
</dependency>
</dependencies>
test 命名规范
测试类名: **/Test*.java (如 TestUserService.java)
测试类名: **/*Test.java (如 UserServiceTest.java)
测试类名: **/*Tests.java (如 UserServiceTests.java)
测试类名: **/*TestCase.java (如 UserServiceTestCase.java)
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class UserServiceTest {
@Test
public void testUserCreation() {
assertTrue(true, "示例测试");
}
}
常用maven插件
maven-javadoc-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.4.1</version>
</plugin>
</plugins>
</build>
mvn javadoc:javadoc 即可生成api说明.
maven-compiler-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
使用 maven-compiler-plugin 插件编译 Java 代码
maven-war-plugin maven-jar-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
配合 jar , 这两个仅仅需要写一个即可. 设置war插件, 就将默认打包打包方式设置为jar. 反之, 设置jar插件, 就将默认打包方式设置为war.
mvn jar:jar
mvn war:war
多模块项目演示
-
使用idea 新建一个普通的mvn项目, 删除生成的src目录
-
在其内部新建->模块 module-api
外层pom.xml 新增 modules<modules> <module>module-api</module> </modules>
外层模块通过 dependencyManagement 标签管理,进行依赖版本的统一管理.
module-api pom.xml
<parent>
<groupId>com.songlili</groupId>
<artifactId>multimodulesapp</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
在根目录或 module-api 执行 mvn clean package 都可以实现 module-api打包.
-
新增spring web 模块 module-web, 添加对module-api的依赖
<dependency> <groupId>com.samunlisa</groupId> <artifactId>module-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
新创建的module-web, 默认不作为子module存在需要进行手动调整. 删除groupId, 添加parent标签
<parent>
<groupId>com.songlili</groupId>
<artifactId>multimodulesapp</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
ps: 发生ide提示代码报错, 却又可以运行. 可以通过 文件 -> 使缓存生效 试一下.
Maven多模块优势
多模块项目是指一个大型项目被划分为多个独立的子模块或子项目,并且这些子模块之间存在一定的依赖关系。每个子模块可以单独进行开发、构建和部署,同时也可以作为整个项目的一部分进行集成。
将大型项目分解为独立的子模块. 使得项目结构更清晰,各个模块的职责和功能划分更明确,便于开发人员理解和维护.
依赖问题不能处理时, 通过 mvn dependency:tree
将生成的文档保存起来丢给deepseek进行分析.
- 父模块通过modules添加子模块的依赖,使他们可以作为整体的一部分进行构建和部署.
- 将通用配置放到父模块中, 避免在每个子模块中重复配置相同的内容.
- 通过父模块dependencyManagment, 确保所有子模块使用相同的版本, 确保依赖一致性和版本兼容性.
- 将项目拆分为各个模块,不同模块由不同团队开发,提高项目开发效率与速度.
- 通过将公共代码或库模块化,可以在多个子模块中共享和重用代码,减少代码冗余,提高开发效率。