Maven常用知识总结
Maven常用知识总结
- Maven 安装与配置
- windows mvn安装与配置
- IntelliJ IDEA 配置
- IntelliJ IDEA 配置系统maven
- Intellij IDEA Maven使用
- IntelliJ IDEA 不能运行项目常见问题
- pom.xml 常用标签讲解
- parent
- groupId artifactId version
- dependency
- properties
- plugin
- packaging
- dependencyManagement
- scope
- optional
- exclusion
- mvn 常用命令
- test编写
- 常用maven插件
- maven-javadoc-plugin
- maven-compiler-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 {@Testpublic 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打包.
3. 新增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, 确保所有子模块使用相同的版本, 确保依赖一致性和版本兼容性.
- 将项目拆分为各个模块,不同模块由不同团队开发,提高项目开发效率与速度.
- 通过将公共代码或库模块化,可以在多个子模块中共享和重用代码,减少代码冗余,提高开发效率。
参考内容
【立零说】Maven 基础 入门教程 安装与配置 项目管理…
若依 前后端分离版 升级到SpringBoot3 教程
maven项目(创建跟导入)设置默认Language level JDK