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

多模块项目演示

  1. 使用idea 新建一个普通的mvn项目, 删除生成的src目录
  2. 在其内部新建->模块 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进行分析.

  1. 父模块通过modules添加子模块的依赖,使他们可以作为整体的一部分进行构建和部署.
  2. 将通用配置放到父模块中, 避免在每个子模块中重复配置相同的内容.
  3. 通过父模块dependencyManagment, 确保所有子模块使用相同的版本, 确保依赖一致性和版本兼容性.
  4. 将项目拆分为各个模块,不同模块由不同团队开发,提高项目开发效率与速度.
  5. 通过将公共代码或库模块化,可以在多个子模块中共享和重用代码,减少代码冗余,提高开发效率。

参考内容

【立零说】Maven 基础 入门教程 安装与配置 项目管理…

若依 前后端分离版 升级到SpringBoot3 教程

maven项目(创建跟导入)设置默认Language level JDK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89625.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP框架在大规模分布式系统的适用性如何?

曾几何时&#xff0c;PHP被贴上“只适合小网站”的标签。但在技术飞速发展的今天&#xff0c;PHP框架&#xff08;如Laravel、Symfony、Hyperf、Swoft等&#xff09; 早已脱胎换骨&#xff0c;勇敢地闯入了大规模分布式系统的疆域。今天&#xff0c;我们就来聊聊它的真实战斗力…

DC-DC降压转换5.5V/3A高效率低静态同步降压转换具有自适应关断功能

概述&#xff1a;PC1032是一款高效且体积小巧的同步降压转换器&#xff0c;适用于低输入电压应用。它是紧凑设计的理想解决方案。其2.5V至5.5V的输入电压范围适用于几乎所有电池供电的应用。在中等至重负载范围内&#xff0c;它以1.5MHz&#xff08;典型值&#xff09;的PWM模式…

min_25筛学习笔记+牛客多校02E

本来没有学习这种较难的算法的想法的&#xff0c;因为比赛也做不到这种难度的题&#xff0c; 但是最近打牛客多校02&#xff0c;有一题要求 [1,n][1,n][1,n] 中素数的个数&#xff0c;我以为是像莫反一样容斥&#xff0c;但是后面感觉不行。赛后知道是用 min_25 筛来求&#xf…

FunASR Paraformer-zh:高效中文端到端语音识别方案全解

项目简介 FunASR 是阿里巴巴达摩院开源的端到端语音识别工具箱,集成了多种语音识别、语音活动检测(VAD)、说话人识别等模块。其中 paraformer-zh 和 paraformer-zh-streaming 是针对中文语音识别任务优化的端到端模型,分别适用于离线和流式场景。Paraformer 采用并行 Tran…

数据结构自学Day9: 二叉树的遍历

一、二叉树的遍历“遍历”就是按某种规则 依次访问树中的每个节点&#xff0c;确保 每个节点都被访问一次且只访问一次遍历&#xff1a;前序 中序 后序&#xff08;深度优先&#xff09;&#xff0c;层序&#xff08;广度优先&#xff09;类型遍历方法特点深度优先遍历前序、中…

Leetcode(7.16)

求二叉树最小深度class Solution {public int minDepth(TreeNode root) {if (root null) {return 0;}Queue<TreeNode> queue new LinkedList<>();queue.offer(root);int depth 0;while (!queue.isEmpty()) {depth;int levelSize queue.size();for (int i 0; i…

Go从入门到精通(25) - 一个简单web项目-实现链路跟踪

Go从入门到精通(25) 一个简单web项目-实现链路跟踪 文章目录Go从入门到精通(25)前言为什么需要分布式链路跟踪&#xff1f;go实现链路跟踪搭建zipkin 服务安装依赖添加tracing包&#xff0c;OpenTelemetry 和Zipkin在 Gin 中集成 OpenTelemetry 中间件log包添加获取traceId方法…

2025年最新秋招java后端面试八股文+场景题

一、Java核心八股文&#xff08;2025年最新版&#xff09;1. Java基础HashMap vs ConcurrentHashMapHashMap&#xff1a;非线程安全&#xff0c;JDK1.8后采用数组链表/红黑树&#xff0c;扩容时可能死循环&#xff08;JDK1.7&#xff09;。ConcurrentHashMap&#xff1a;JDK1.8…

esp32 sd卡

ref&#xff1a; platform io & arduino Boards — PlatformIO latest documentation https://github.com/espressif/arduino-esp32/blob/master/libraries/SD_MMC/README.md SD 卡实验 | 极客侠GeeksMan GitHub - fabianoriccardi/ESPLogger: An Arduino library pro…

Java学习--------消息队列的重复消费、消失与顺序性的深度解析​

在 Java 分布式系统开发中&#xff0c;消息队列的应用已十分普遍。但随着业务规模扩大&#xff0c;消息的重复消费、意外消失、顺序错乱等问题逐渐成为系统稳定性的隐患。本文将从 Java 开发者的视角&#xff0c;深入分析这三大问题的产生原因、业务后果&#xff0c;并结合具体…

【Oracle】centos7离线静默安装oracle11g(p13390677_112040)

博文地址&#xff1a;https://blog.csdn.net/gitblog_06670/article/details/142569814 仓库地址&#xff1a;https://gitcode.com/Open-source-documentation-tutorial/31eb1/?utm_sourcedocument_gitcode&indexbottom&typecard 参考安装地址&#xff1a; 收费版&…

智能设备畅想

### 智能设备畅想 突然想到了一个好主意 因为最近在查无人机的相关资料&#xff08;很早之前就想搞个无人机玩玩但始终没有买&#xff09; 在了解自组装方面的内容时&#xff0c;和AI沟通了下 正好之前组装的 小智AI 基本上已经完善了&#xff0c;也正在考虑其在其他方向拓展的…

SpringAI——ChatModel

我的前面一篇文章&#xff08;SpringAI——ChatClient配置与使用&#xff09;中讲了ChatClient&#xff0c;它是一个构建于 ChatModel 之上的高层封装&#xff0c;它提供了更丰富的对话交互能力。可以这么说ChatModel相当于发动机&#xff0c;ChatClient相当于一台含有发动机、…

Zabbix监控K8S的PV信息详细教程!

文将介绍如何使用Zabbix自定义键值脚本方式监控K8S的PV卷状态等信息。 在Kubernetes (K8S) 中&#xff0c;PersistentVolume (PV) 是集群中的一个抽象层&#xff0c;它代表了底层存储资源&#xff0c;例如网络存储系统&#xff08;如NFS、Ceph、GlusterFS等&#xff09;或本地存…

wx小程序原生开发使用高德地图api

第一步&#xff1a;注册高德地图api的key第二步&#xff1a;下载amap-wx.js 放到项目的某个目录第三步&#xff1a;配置app.json&#xff08;必须&#xff0c;因为需要定位功能&#xff0c;&#xff09;"requiredPrivateInfos": ["getLocation"],"per…

如何通过mac的前24bit,模糊确认是那一台什么样的设备

MAC Address Lookup - MAC/OUI/IAB/IEEE Vendor Manufacturer Search Wireshark • Go Deep 上面这两个网址提供了&#xff0c;正对mac 的前24位&#xff0c;查找对应的网络设备厂商信息&#xff0c;可以让我们在运维过程中模糊的判断大约是什么型号的设备 使用macvendorloo…

【爬虫】04 - 高级数据存储

爬虫04 - 高级数据存储 文章目录爬虫04 - 高级数据存储一&#xff1a;加密数据的存储二&#xff1a;JSON Schema校验三&#xff1a;云原生NoSQL(了解)四&#xff1a;Redis Edge近端计算(了解)五&#xff1a;二进制存储1&#xff1a;Pickle2&#xff1a;Parquet一&#xff1a;加…

UDP和TCP的主要区别是什么?

在网络通信中&#xff0c;TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是两种核心的传输层协议。它们各自的特点和应用场景截然不同&#xff0c;理解两者的区别对于选择合适的通信方式至关重要。本文将通过几个关键点&#xff0c;用简…

Softhub软件下载站实战开发(十八):软件分类展示

Softhub软件下载站实战开发&#xff08;十八&#xff09;&#xff1a;软件分类展示 &#x1f5a5;️ 在之前文章中&#xff0c;我们实现了后台管理相关部分&#xff0c;本篇文章开始我们来实现用户端页面&#xff0c;由于内网使用&#xff0c;不需要sso优化等特性&#xff0c;我…

linux--------------------BlockQueue的生产者消费模型

1.基础BlockingQueue的生产者消费模型 1.1 BlockQueue 在多线程编程中阻塞队列是一种常用于实现生产者和消费者模型的数据结构&#xff0c;它与普通的队列区别在于&#xff0c;当队列为空时&#xff0c;从队列获取元素的操作将被阻塞&#xff0c;直到队列中放入了新的数据。当…