Maven高级使用指南
在开发大型项目时,Maven作为一个强大的构建和项目管理工具,能显著提升项目管理和构建的效率。然而,随着项目的扩大,维护和管理的复杂性也随之增加。本文将探讨一些高级的Maven用法和解决方案,以帮助你更好地管理大型项目
1. 项目分模块管理
在处理大型项目时,项目的复杂性和规模会显著增加,使得维护和复用变得困难。为了解决这些问题,常见的做法是将一个大项目拆分为多个模块,每个模块负责处理不同的功能或业务逻辑。这种做法不仅可以提高代码的组织性,还能促进模块的重用。
问题:重复配置依赖
在一个多模块的项目中,每个模块通常需要引入相同的依赖库。如果在每个模块的pom.xml
文件中都重复配置这些依赖,会导致以下问题:
- 维护难度增加:当依赖版本需要更新时,必须在每个模块中进行修改,容易遗漏或出错。
- 冗余配置:重复的配置增加了项目的复杂度和维护成本。
- 版本冲突:如果不同模块使用了不同版本的相同依赖,可能导致兼容性问题。
解决方案:引入父工程
为了简化依赖管理,Maven提供了继承机制,通过创建一个父工程(Parent Project),可以在父工程中集中管理所有公共的依赖和插件配置。这种方式可以显著减少重复配置,提高项目的可维护性。
步骤如下:
-
创建父工程:首先,创建一个父工程,其
pom.xml
文件中只包含依赖和插件的配置,不包含实际的业务代码。(父工程的打包方式设为pom) -
父工程的
pom.xml
示例:
<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/POM/4.0.0"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version><packaging>pom</packaging><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.8</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><!-- 更多公共依赖 --></dependencies><build><pluginManagement><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></pluginManagement></build><modules><module>module-a</module><module>module-b</module><!-- 更多子模块 --></modules>
</project>
子模块继承父工程:在每个子模块的pom.xml
文件中,指定父工程,并使用父工程中定义的依赖和插件配置。
子模块的pom.xml
示例:
<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/POM/4.0.0"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version><relativePath>../parent-project/pom.xml</relativePath></parent><artifactId>module-a</artifactId></project>
2. 版本管理
在多模块项目中,管理不同模块之间的版本变得尤为重要。如果每个模块都单独管理版本,容易导致不一致的情况。
解决方案:
在父工程中使用<dependencyManagement>
标签统一管理依赖版本。这个标签仅定义依赖版本,但不会将依赖实际引入到构建中。
<dependencyManagement><dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><!-- 更多依赖 --></dependencies>
</dependencyManagement>
此外,可以使用<properties>
标签定义版本号等属性,方便统一管理。
<properties><project.version>0.0.1</project.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><java.version>11</java.version><cloud.version>2021.0.1</cloud.version><cloud-alibaba.version>2021.0.1.0</cloud-alibaba.version><mysql.version>8.0.26</mysql.version><druid.verison>1.2.11</druid.verison></properties><dependencyManagement><dependencies><!--SpringCloud--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--SpringCloudAlibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!-- security --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-security</artifactId><version>${security.version}</version></dependency><!-- oauth2 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId><version>${oauth2.version}</version></dependency><!-- rabbitmq --></dependencies></dependencyManagement>
dependencies
:用于实际引入依赖库,定义了项目的实际依赖项,包括依赖的版本。dependencyManagement
:用于集中管理依赖的版本信息,子模块可以使用这些版本信息,但不直接引入这些依赖。
3. 聚合构建
在多模块项目中,单独构建每个模块可能会比较繁琐。通过Maven的聚合功能,可以将多个模块组织成一个整体进行构建。
解决方案:
创建一个聚合工程(父工程),它只包含一个pom.xml
文件,没有业务代码,通过<modules>
标签列出所有子模块。然后,在聚合工程目录下执行mvn install
,Maven会自动构建所有子模块。
示例:
<project><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><modules><module>module-a</module><module>module-b</module><!-- 更多模块 --></modules>
</project>
4. 私服配置
在团队开发中,共享自定义的JAR包时,将其上传到中央仓库是不现实的,通常公司会搭建自己的私有Maven仓库。
使用私服,需要在maven的settings.xml配置文件中,做如下配置:
-
需要在 servers 标签中,配置访问私服的个人凭证(访问的用户名和密码)
<server><id>maven-releases</id><username>admin</username><password>admin</password> </server><server><id>maven-snapshots</id><username>admin</username><password>admin</password> </server>
-
在 mirrors 中只配置我们自己私服的连接地址(如果之前配置过阿里云,需要直接替换掉)
<mirror><id>maven-public</id><mirrorOf>*</mirrorOf><url>http://112.128.130.121:8081/repository/maven-public/</url> </mirror>
-
需要在 profiles 中,增加如下配置,来指定snapshot快照版本的依赖,依然允许使用
<profile><id>allow-snapshots</id><activation><activeByDefault>true</activeByDefault></activation><repositories><repository><id>maven-public</id><url>http://112.128.130.121:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories> </profile>
-
如果需要上传自己的项目到私服上,需要在项目的pom.xml文件中,增加如下配置,来配置项目发布的地址(也就是私服的地址)
<distributionManagement><!-- release版本的发布地址 --><repository><id>maven-releases</id><url>http://192.168.150.101:8081/repository/maven-releases/</url></repository><!-- snapshot版本的发布地址 --><snapshotRepository><id>maven-snapshots</id><url>http://192.168.150.101:8081/repository/maven-snapshots/</url></snapshotRepository> </distributionManagement>
-
发布项目,直接运行 deploy 生命周期即可 (发布时,建议跳过单元测试)
启动本地私服
-
解压: apache-maven-nexus.zip
-
进入目录: apache-maven-nexus\nexus-3.39.0-01\bin
-
启动服务:双击 start.bat
-
访问服务:localhost:8081
-
私服配置说明:将上述配置私服信息的 192.168.150.101 改为 localhost
总结
Maven作为一个强大的构建工具,提供了丰富的功能来帮助管理和构建大型项目。通过合理使用父工程、版本管理、聚合构建和私服配置,可以有效地简化多模块项目的管理,提高开发效率。希望本文提供的高级Maven用法和解决方案能帮助你更好地应对项目中的各种挑战。如果你有更多问题或想法,欢迎在评论区讨论!
相关文章:
![](https://i-blog.csdnimg.cn/direct/e06906ab2ca54709af069126f719013a.png)
Maven高级使用指南
在开发大型项目时,Maven作为一个强大的构建和项目管理工具,能显著提升项目管理和构建的效率。然而,随着项目的扩大,维护和管理的复杂性也随之增加。本文将探讨一些高级的Maven用法和解决方案,以帮助你更好地管理大型项…...
![](https://www.ngui.cc/images/no-images.jpg)
windows docker 执行apt-get 权限问题
今天在windows下安装的docker 部署的容器执行apt-get遇到权限问题 PS C:\Users\xiaok> docker exec -it jenkins sh $ apt-get update Reading package lists... Done E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) E: Unable to l…...
![](https://i-blog.csdnimg.cn/direct/eb234bf41cab42d280aa018de046f389.png)
Linux系统信息排查
目录 介绍步骤 介绍 1、熟悉查看CPU信息、操作系统信息、用户信息、特殊权限账户、启动项和任务计划的排查命令 2、在进行受害主机排查时,首先要对主机系统进行基本排查,方便对受害主机有一个初步的了解。 3、利用lscpu和uname -a查看系统硬件软件基本…...
![](https://i-blog.csdnimg.cn/direct/40a2047893e94721b506f7a08debbfc5.png#pic_center)
《图解设计模式》笔记(四)分开考虑
九、Bridge模式:将类的功能层次结构与实现层次结构分离 类的两个层次结构和作用 类的功能层次结构:希望增加新功能时 父类有基本功能,在子类中增加新功能 Something父类 …├─SomethingGood子类 想要再增加新功能 Something父类 …├─So…...
![](https://i-blog.csdnimg.cn/direct/cafeffc5ee714758847449eff98c84ec.png)
Linux shell编程学习笔记74:sed命令——沧海横流任我行(中)
0 前言 自 60 年代末以来,sed 一直是 Unix 标准工具箱的一部分。 Sed在以下三种情况下特别有用: 编辑太大的文件,无法进行舒适的交互式编辑; 当编辑命令序列过于复杂而无法在交互模式下轻松键入时,可以编辑任何大小的…...
![](https://i-blog.csdnimg.cn/direct/12e6ea3d3b5d4d40841e7ff50d64a81e.png)
[数据集][目标检测]道路积水检测数据集VOC+YOLO格式2699张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2699 标注数量(xml文件个数):2699 标注数量(txt文件个数):2699 标注…...
![](https://i-blog.csdnimg.cn/direct/850fb0c4d66c4abab08e4c503076e5d5.png)
不同路径
不同路径 思路: 法一:动态规划 const int N 110; class Solution { int dp[N][N];//dp[i][j]:从起点走到 i j的路径个数。 public:int uniquePaths(int m, int n) {for(int i1;i<n;i){dp[1][i]1;} for(int i1;i<m;i) dp[i][1]1;f…...
![](https://i-blog.csdnimg.cn/direct/a4976a55e43a450a97c0ed1a951b5119.png)
【HTML】HTML学习之引入CSS样式表
1、CSS样式规则 选择器{属性1:属性值1; 属性2:属性值2; 属性3:属性值3;}2、HTML引入CSS样式表 2.1、行内式 行内式也称为内联样式,是通过标签的style属性来设置元素的样式,其基本语法格式如下: <标签名 style"属性1:属性值1; 属性2:属性值2;…...
![](https://i-blog.csdnimg.cn/direct/bce85b848a5f4bb599967df2f2a20e48.png)
shaushaushau1
CVE-2023-7130 靶标介绍: College Notes Gallery 2.0 允许通过“/notes/login.php”中的参数‘user’进行 SQL 注入。利用这个问题可能会使攻击者有机会破坏应用程序,访问或修改数据. 已经告诉你在哪里存在sql注入了,一般上来应该先目录扫…...
![](https://img-blog.csdnimg.cn/direct/cd137335378c45e4a7300d4c8953cf95.png)
揭秘面试必备:高频算法与面试题全面解析
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
![](https://www.ngui.cc/images/no-images.jpg)
设计模式-visit模式-在语法树的实践
文章目录 背景示例代码分析灵活性双重分派 总结 背景 很多项目代码有accept()用法,在calcite 里也看到了这种,深入了解一下 语法树遍历:编译器通常会将源代码解析成抽象语法树(AST)。为了实现不同的编译阶段ÿ…...
![](https://i-blog.csdnimg.cn/direct/f023528a296d446f9bd2fe3b71e629b9.png#pic_center)
ZK-Rollups测评
1. 引言 Matter Labs团队和多个高校研究人员一起,发布2024年论文《Analyzing and Benchmarking ZK-Rollups》,开源代码见: https://github.com/StefanosChaliasos/zkrollup-benchmarking(Python) 其中: …...
![](https://www.ngui.cc/images/no-images.jpg)
redis生产使用场景(一):并行流+二级缓存
本文主要介绍 redis 缓存在线上的使用场景 由于业务的特殊性,在生产库用户表中,大概有 50 多万的测试用户,在真实业务计算中,要把测试用户给筛选掉,所以在计算前,需要把测试用户加载到 redis 缓存中&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
EXCEL跨文件查询,指定条件列,返回满足条件的指定列
EXCEL跨文件查询,指定条件列,返回满足条件的指定列 Private Sub cmd_find_from_workbooks_Click() Dim S_Cols As String, thePath As String, Sor_Col As Integer, sz_Cols As Variant S_Cols T_jieguo_cols.Text sz_Cols Split(S_Cols, ",&quo…...
![](https://i-blog.csdnimg.cn/direct/3a9394486b814bfb8375b65a74a4d637.png)
[数据集][目标检测]流水线物件检测数据集VOC+YOLO格式9255张26类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):9255 标注数量(xml文件个数):9255 标注数量(txt文件个数):9255 标注…...
![](https://img-blog.csdnimg.cn/img_convert/50e73996fb40bb854b8febfb94d91dd4.jpeg)
StarRocks 存算分离 Compaction 原理
前言 StarRocks 中每次数据摄入都会生成一个新的数据版本,而查询时需要将所有版本数据进行合并才能获得一个正确的结果,如果历史数据版本太多,那么查询时需要读取的文件数也会很多,造成查询效率低下。因而 StarRocks 存在内部任务…...
![](https://i-blog.csdnimg.cn/direct/a95fb1abc9804e3bbc84fb29bd1c95ef.gif)
搭建ELK日志采集与分析系统
SpringCloud微服务实战——企业级开发框架 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您…...
![](https://www.ngui.cc/images/no-images.jpg)
java集合中自动排序的treeset和treemap
底层 TreeSet 和 TreeMap 的底层架构都是基于红黑树实现的。红黑树是一种自平衡的二叉搜索树,其特性保证了插入、删除和查找操作的时间复杂度为 (O( log n \log n logn)),无论数据量多大,操作性能都能保持在合理的范围内。 1. 红黑树概述 红黑树是一种平衡二叉搜索树(…...
![](https://i-blog.csdnimg.cn/direct/34c91007f3904036bba65d1dd732d51c.png)
Android 修改SystemUI 音量条的声音进度条样式
一、前言 Android System UI 开发经常会遇到修改音量进度条样式的需求,主要涉及的类有VolumeDialogImpl与xml文件,接下来会逐步实现流程。先看看效果。 修改前 修改后 二、找到对应类 通过aidegen 打断点调试对应代码类VolumeDialogImpl定位到volume_d…...
![](https://www.ngui.cc/images/no-images.jpg)
电商场景的视频生成的prompt测评集合
1.收集的一些提示词 一台写着Vidu的赛车在路上飞驰,赛车上面坐着一只乌龟 一个宇航员在太空中骑单车 两个巨大的机器人在打架,电影风格,史诗感,高细节 在科幻电影风格中,两个巨大的机器人在城市废墟中激烈战斗。使用高角度俯拍,展现机器人的宏伟和战斗的史诗感。机器人…...
![](https://i-blog.csdnimg.cn/direct/38e29483279d47609eba2b7588f6b6a0.jpeg)
day34
1 非阻塞型IO 让我们的read函数不再阻塞,无论是否读取到消息,立刻返回 1.1 fcntl函数 原型:int fcntl(int fd, int cmd, ... /* arg */ ); 调用:int flag fcntl(描述符,F_GETFL) fcntl(描述符,F_SETFL&am…...
![](https://img-blog.csdnimg.cn/img_convert/7659ff2d682d6e76d7d773de212a6152.png)
无缝融入,即刻智能[三]:Dify-LLM平台知识库构建(多路召回、精排重排),43K+星标见证专属智能方案
无缝融入,即刻智能[三]:Dify-LLM平台知识库构建(多路召回、精排重排),43K+星标见证专属智能方案 大语言模型的训练数据一般基于公开的数据,且每一次训练需要消耗大量算力,这意味着模型的知识一般不会包含私有领域的知识,同时在公开知识领域存在一定的滞后性。为了解决这一…...
![](https://www.ngui.cc/images/no-images.jpg)
AWS服务WAF
在 AWS 中使用 Web Application Firewall (WAF) 来防御常见的攻击手段,如 DDoS 攻击和 SQL 注入攻击,可以通过创建和配置规则来实现。下面是如何使用 AWS WAF 阻止这些常见攻击的详细操作步骤。 1. 登录到 AWS 管理控制台 打开 AWS 管理控制台。使用你…...
![](https://i-blog.csdnimg.cn/direct/f5f1e450c54e48ec8fa77a1268d22104.png)
二叉树中的奇偶树问题
目录 一题目: 二思路汇总: 1.二叉树层序遍历: 1.1题目介绍: 1.2 解答代码(c版): 1.3 解答代码(c版): 1.4 小结一下: 2.奇偶树分析…...
![](https://i-blog.csdnimg.cn/direct/0f99cece136241a6834de9e2eaf81c6f.png)
GD - EmbeddedBuilder - 用DMA进行串口发送接收,支持接收不定长包
文章目录 GD - EmbeddedBuilder - 用DMA进行串口发送接收,支持接收不定长包概述笔记硬件连接图形化配置485EN的配置串口的图形化配置 代码实现main.cgd32f3x0_hal_it.cgd32f3x0_hal_init.cgd32f3x0_hal_init.hgd32f3x0_hal_it.hgd32f3x0_libopt.h 备注END GD - Embe…...
![](https://www.ngui.cc/images/no-images.jpg)
英语中apartment(公寓)(美式)、house(房子)、flat(公寓)(英式)、villa(别墅)、room(房间)区别
文章目录 英语中apartment、house、flat、villa、room区别 英语中apartment、house、flat、villa、room区别 在英语中,“apartment”、“house”、“flat”、“villa”、和 “room” 这些词语都与居住空间有关,但它们各自的含义和用途有所不同ÿ…...
![](https://i-blog.csdnimg.cn/direct/e979bc1e7c5944b6b5ec9eded2133b17.png)
黑马头条vue2.0项目实战(十一)——功能优化(组件缓存、响应拦截器、路由跳转与权限管理)
1. 组件缓存 1.1 介绍 先来看一个问题? 从首页切换到我的,再从我的回到首页,我们发现首页重新渲染原来的状态没有了。 首先,这是正常的状态,并非问题,路由在切换的时候会销毁切出去的页面组件ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
《AI视频类工具之一—— 即创》
一.简介 官网:即创 - 一站式智能创意生产与管理平台 即创是字节跳动(现更名为抖音集团)旗下的一款一站式智能创意生产与管理平台,旨在帮助用户高效地进行创意内容的生成、管理和分析。 二.功能介绍 视频创作: 智能成片:利用AI技术自动编辑视频片段,快速生成完整的视频…...
![](https://www.ngui.cc/images/no-images.jpg)
CSS的:host伪类:精确定位于Web组件的指南
随着Web组件技术的发展,自定义元素(Custom Elements)已经成为现代Web开发中不可或缺的一部分。CSS的:host伪类为Web组件的样式封装提供了一种强大的工具,它允许开发者为自定义Web组件的宿主元素定义样式。本文将详细介绍:host伪类…...
![](https://i-blog.csdnimg.cn/direct/24b6d6e050e44caea69794a7868a5ac9.png)
安卓sdk manager下载安装
安卓sdk下载安装 android SDK manager下载 环境变量配置 ANDROID_HOME:D:\Android %ANDROID_HOME%\tools %ANDROID_HOME%\platform-tools %ANDROID_HOME%\build-tools\29.0.3Android SDK Platform-tools公用开发工具包,需要下载 Android SDK Tools基础…...
![](/images/no-images.jpg)
音乐网站的建设/seo技术培训教程视频
很遗憾,systemc官方提供的SDK并不能直接在 mac os x 下用 gcc编译链接。 需要做如下 修改 : 1、为configure添加编译环境支持,简单的说,就是修改config/config.sub,加入i686-apple-darwin10编译环境。不同操作系统版本…...
![](https://images2015.cnblogs.com/blog/637423/201510/637423-20151026180135904-2074295771.jpg)
动态网站搭建方案/google下载安装
目前接触到一个需求,需要全球主要国家的选择以及语言的选择,如下图: 这是国家选项 这是语言的选项: 很简单有木有? 本来打算直接给文件,但是好像没有文件上传,所以就提供一个思路和代码…...
![](https://img-blog.csdnimg.cn/img_convert/67d0865f17d9be527254bf8a8ff6c5b4.gif)
新开传奇网站单职业/推广平台排行榜app
一、NDK中获取android设备ID的方式Java代码如下(获取设备ANDROID_ID):final String androidId Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);对应的c代码(相当蛋疼),注意如果是C,需要把所有的(*env)->替换成env-&…...
音乐网站设计外国/seo营销怎么做
Go Web编程--SecureCookie实现客户端Session管理在Web应用开发中Session是在用户和服务器之间进行交换的非持久化交互信息。当用户登录时,可以在用户和服务器之间生成Session,然后来回交换数据,并在用户登出时销毁Session。gorilla/sessions软…...
![](/images/no-images.jpg)
宝鸡专业做网站/郴州网站建设网络推广渠道
解决办法: 一、在以下路径中找到jeesite文件,并删除 1.Tomcat 7.0\conf\Catalina\localhost 2.Tomcat 7.0\webapps 3.Tomcat 7.0\work\Catalina\localhost 二、但到这步还是没解决,还是照样加载jeesite项目 找到Tomcat 7.0\wtpwebapps下的jee…...
![](/images/no-images.jpg)
成都免费招聘网站/常州百度搜索优化
,之前看<<PostgreSQL数据库内核分析>>这本书,提到了postmaster进程,于是在我安装的PG 9.6.0中,ps -ef了一把,结果没找到,如下:[postgresrhel73 global]$ pwd /usr/local/pgsql/data/global [postgresrhel73 global]$ ps -ef | grep -i post root 2220 1 …...