Maven——Maven开发经验总结(1)

摘要

本文总结了 Maven 开发中的多个关键经验,包括如何根据版本号决定推送到 releases 或 snapshots 仓库,如何在构建过程中跳过测试,父项目如何控制子项目依赖版本,父项目依赖是否能传递到子项目,如何跳过 Maven deploy 中的某个 module,以及 Maven package 时如何跳过测试等,为 Maven 开发提供了实用指南。

1. Maven在运行部署的时候是如何确定推送到Releases还是Snapshots仓库

在 Maven 中,部署到 releasessnapshots 仓库的决定是通过版本号来判断的。具体规则如下:

  1. 版本号规则
    • Release 版本:如果版本号不包含 -SNAPSHOT 后缀,Maven 会认为这是一个稳定的发布版本,并会推送到 releases 仓库。例如:1.0.0
    • Snapshot 版本:如果版本号包含 -SNAPSHOT 后缀,Maven 会认为这是一个开发版本,并会推送到 snapshots 仓库。例如:1.0.0-SNAPSHOT
  1. Maven 配置文件(pom.xml: 在你的项目的 pom.xml 文件中,指定仓库的 URL 和仓库的 ID。通常,在 <distributionManagement> 部分,Maven 会配置 releasessnapshots 仓库的地址。例如:
<distributionManagement><repository><id>releases</id><url>https://repo.maven.apache.org/maven2</url></repository><snapshotRepository><id>snapshots</id><url>https://oss.sonatype.org/content/repositories/snapshots/</url></snapshotRepository>
</distributionManagement>

在这里,Maven 会根据你的版本号(是否包含 -SNAPSHOT 后缀)决定将构件部署到哪个仓库。

  1. 部署过程
    • 当你执行 mvn deploy 时,Maven 会根据 pom.xml 中的版本号以及配置文件中的仓库信息判断将构件推送到哪个仓库。
    • 对于 SNAPSHOT 版本,Maven 会推送到 snapshots 仓库,并且通常会带有时间戳,允许多个相同版本的构件在同一时间存在。
    • 对于 release 版本,Maven 会推送到 releases 仓库,并且这个版本通常是稳定的,不会再更新。
  1. 推送行为
    • 对于 SNAPSHOT 版本,Maven 会允许在推送时覆盖同一版本号的构件(如:同一版本的 1.0.0-SNAPSHOT 可以被不同的构建替换),这使得开发过程中可以频繁更新。
  • 对于 release 版本,推送到 releases 仓库时,版本号必须是唯一的,不允许覆盖已发布的版本。

总结来说,版本号的后缀决定了推送目标仓库

  • -SNAPSHOT 推送到 snapshots 仓库。
  • 不含 -SNAPSHOT 的版本推送到 releases 仓库。

2. Maven在构建过程中跳过测试

<build><pluginManagement><plugins><plugin><artifactId>maven-surefire-plugin</artifactId><configuration><!-- 跳过测试 --><skip>true</skip></configuration></plugin></plugins></pluginManagement>
</build>

2.1. Maven Surefire Plugin 的作用

  • Maven Surefire Plugin 是 Maven 的核心插件之一,用于执行单元测试。
  • 默认情况下,Maven 在构建项目时会自动运行 src/test/java 目录下的测试类。
  • 通过配置 <skip>true</skip>,可以跳过测试阶段,从而加快构建速度。

2.2. 实际应用场景

  1. 加快构建速度: 在开发过程中,如果不需要运行测试,可以通过跳过测试来加快构建速度。
  2. 跳过失败的测试: 如果某些测试暂时失败,但需要继续构建项目,可以通过跳过测试来避免构建失败。
  3. 配置统一管理: 在大型项目中,可以通过 <pluginManagement> 集中管理插件配置,确保所有子项目使用相同的插件行为。

2.3. 注意事项

  • 如果需要强制跳过测试,可以在命令行中直接使用 -DskipTests 参数,例如:
mvn clean install -DskipTests
  • 如果只是跳过测试的编译,可以使用 -Dmaven.test.skip=true 参数,例如:
mvn clean install -Dmaven.test.skip=true

3. Maven 项目中父项目pom 控制子项目pom的依赖版本吗?

是的,在 Maven 项目中,pom.xml 可以控制 子模块 (sub-modules) 的依赖版本,主要有两种方式:

3.1. 使用<dependencyManagement> 统一管理版本

推荐做法:在 pom.xml 里使用 <dependencyManagement> 只定义依赖版本,子模块在引入时不需要指定版本。

3.1.1. 父项目 pom.xml

<project><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version><packaging>pom</packaging><modules><module>sub-module-a</module><module>sub-module-b</module></modules><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.5</version>  <!-- 统一管理版本 --></dependency></dependencies></dependencyManagement>
</project>

3.1.2. 子项目 pom.xml(无需指定版本)

<project><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version></parent><artifactId>sub-module-a</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

3.1.3. 优势

  • 子模块无需指定版本,版本由父 pom.xml 控制,保证一致性。
  • 便于升级依赖,只需修改父 pom.xml 中的版本号。

3.2. 直接在 <dependencies> 中定义(不推荐)

如果在 pom.xml 里直接写 <dependencies>,那么子模块会继承这些依赖,但子模块如果有自己的版本,可能会发生冲突

3.2.1. 父项目 pom.xml

<project><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.5</version>  <!-- 子模块会自动继承 --></dependency></dependencies>
</project>

3.2.2. 子项目 pom.xml

e<project><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

3.2.3. ⚠️ 缺点

  • 子模块无法单独管理依赖版本,可能会与其他依赖冲突。
  • 如果子模块也指定了版本,可能导致版本不一致(依赖冲突)。

3.3. Maven父子项目依赖管理总结

方式

方式 1(✅ 推荐)
<dependencyManagement>

方式 2(⚠️ 不推荐)
直接 <dependencies>

子模块是否需要指定版本

不需要,父 POM 控制

需要,如果不指定可能继承

子模块能否覆盖版本

可以,但默认使用父 POM 版本

可以,但可能会版本冲突

适合多模块项目

,能确保版本统一

,易发生版本冲突

最佳实践

  • 在父 pom.xml 里使用 <dependencyManagement> 统一管理版本
  • 子模块只声明依赖,不要指定版本,避免版本混乱。

这种方式适用于 Spring Boot、MyBatis、Dubbo 等大部分多模块 Maven 项目,能提高维护性和稳定性。🚀

4. 父项目Maven依赖是否可以传递到子项目

一个项目引用了nacos的依赖,这个项目中依赖jar 也使用naocs的配置,请问这个的jar 在打包的时候是否需要使用ncos依赖 进行package 。

在你的项目中,如果引用了 Nacos 作为依赖,并且其他 jar 包也使用了 Nacos 配置,通常来说,这些 jar 包在打包时是否需要包含 Nacos 依赖,取决于你对项目的构建方式和依赖管理的配置。

4.1. 依赖传递(Transitive Dependency):

如果你在主项目中引用了 Nacos 的依赖,并且这个主项目的 jar 包会包含并传递 Nacos 依赖给其他模块,那么其他 jar 包在打包时通常 不需要再单独引用 Nacos,主项目中的 Nacos 依赖会被自动引入。这种情况通常适用于基于 Maven 或 Gradle 构建的项目,依赖会在构建时被传递。

例如,在 Maven 项目中,Nacos 的依赖应该已经在父项目的 pom.xml 中声明:

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.x.x</version>
</dependency>

4.2. 独立打包(Standalone Packaging)

如果你要将某些 jar 包独立打包为单独的应用,且这些应用需要独立引用 Nacos 依赖(例如,一个 jar 作为微服务应用单独运行),那么这些 jar 在打包时可能需要单独包含 Nacos 依赖。你可以通过使用 shade 插件(Maven)或其他类似的工具,将所有依赖都打包进最终的 jar 包中。

示例: Maven 中使用 maven-shade-plugin

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.x.x</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals></execution></executions><configuration><artifactSet><excludes><exclude>com.alibaba.nacos:nacos-client</exclude> <!-- 排除某些依赖 --></excludes></artifactSet></configuration>
</plugin>

4.3. 使用 provided 作用域

如果 Nacos 只在运行时需要(例如在容器或框架中自动注入),你可以将 Nacos 依赖的作用域设置为 provided。这样,Nacos 不会被打包进最终的 jar 中,而是在运行时由外部环境提供。

例如,在 Maven 中设置 Nacos 依赖为 provided

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.x.x</version><scope>provided</scope>
</dependency>

4.4. 依赖的 jar 包直接引用 Nacos

如果某些 jar 包本身直接引用了 Nacos,那么它们在编译时会自动将 Nacos 依赖引入。当这些 jar 被打包时,它们会将这些依赖一起打包。如果你使用 fat jaruber jar 方式打包,这些依赖也会被包括进去。

4.5. 依赖传递总结

  • 如果你依赖的 jar 包已经在主项目中引用了 Nacos,且你使用的是 Maven 或 Gradle 等构建工具,通常 不需要再次单独引入 Nacos
  • 如果你希望 独立打包并包含 Nacos,可以使用 shade 插件或者类似的工具。
  • 若 Nacos 仅用于运行时而不需要打包到 jar 中,可以使用 provided 作用域。

根据项目的具体需求和构建方式,你可以选择适合的方式来管理 Nacos 依赖。

5. Maven deploy跳过某个module解决办法

在使用 Maven 时,如果你希望跳过某个模块的 deploy 操作(即不将某个模块部署到远程仓库),可以通过以下几种方法来实现:

5.1. 方法 1:使用 -pl 参数(指定要部署的模块)

你可以使用 -pl 参数来指定需要部署的模块列表,跳过不需要部署的模块。比如,假设你有一个多模块项目,其中有一个模块你不想部署,可以通过指定其它模块来跳过这个模块的部署。

mvn deploy -pl !module-to-skip
  • -pl:指定要构建或部署的模块。
  • !module-to-skip:通过 ! 语法排除 module-to-skip 模块。

5.2. 方法 2:在 pom.xml 中使用 profiles 配置

你可以在 pom.xml 文件中定义一个专门的 Maven profile,并在该 profile 中排除某些模块的构建或部署。通过在构建时激活该 profile 来跳过某个模块。

示例:在父 pom.xml 中配置一个 deploy-skip profile,指定不部署某个模块:

<profiles><profile><id>deploy-skip</id><modules><module>module1</module><module>module2</module><!-- 排除 module-to-skip --></modules></profile>
</profiles>

然后通过 -P 参数激活该 profile:

mvn deploy -Pdeploy-skip

这种方法适用于你有多个环境或配置,并且希望在不同的构建配置下部署不同的模块。

5.3. 方法 3:跳过特定的模块构建和部署

如果你希望完全跳过某个模块的构建或部署,可以通过设置 skip 配置,跳过该模块的构建或 deploy 生命周期。例如,如果某个模块的构建时间较长,或因其他原因不需要部署,可以在其 pom.xml 中添加以下配置来跳过部署:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-deploy-plugin</artifactId><version>3.0.0-M1</version><configuration><skip>true</skip></configuration></plugin></plugins>
</build>

5.4. 方法 4:使用 maven-skip-plugin

有时候,如果你只是想简单地跳过某个模块的构建或 deploy,你可以使用 maven-skip-plugin 插件。在父 pom.xml 或模块 pom.xml 中添加以下配置,来跳过特定模块的 deploy 阶段。

示例:

<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-deploy-plugin</artifactId><version>3.0.0</version><configuration><skip>true</skip></configuration></plugin>
</plugins>

5.5. 方法 5:临时跳过 deploy 阶段

如果你不想部署某个模块,但又不希望修改 pom.xml 或配置,可以临时使用 -DskipDeploy 来跳过部署:

mvn deploy -DskipDeploy

5.6. 方法 6:使用 mvn install 而不是 deploy

如果你在某个模块不需要将其部署到远程仓库,只是本地构建并安装到本地仓库,可以使用 install 代替 deploy

mvn install

这样该模块会被安装到本地仓库,而不会部署到远程仓库。

6. Maven package 的时候跳过测试。

在使用 mvn package 时,如果你希望跳过测试阶段(即不执行单元测试),可以通过以下几种方式来实现:

6.1. 使用 -DskipTests 参数

这是最常用的方式,使用 -DskipTests 参数来跳过测试的执行。该命令只会跳过测试的执行,而不会跳过编译测试代码。

mvn package -DskipTests
  • -DskipTests:跳过测试执行,测试代码会被编译,但不会运行。

6.2. 使用 -Dtest=false 参数

另一种方式是使用 -Dtest=false 参数,这会告诉 Maven 不执行任何测试。

mvn package -Dtest=false
  • -Dtest=false:强制不执行测试,不会运行任何测试类。

6.3. 使用 -Dmaven.test.skip=true 参数

如果你希望完全跳过测试,包括测试代码的编译和执行,可以使用 -Dmaven.test.skip=true 参数。这会跳过测试的所有阶段,包括编译和执行测试。

mvn package -Dmaven.test.skip=true
  • -Dmaven.test.skip=true:完全跳过测试阶段(包括测试的编译和执行)。

6.4. 在 pom.xml 中配置跳过测试

如果你希望在构建过程中总是跳过测试,可以在 pom.xml 中配置跳过测试的属性。

pom.xml 文件中添加以下配置:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.0.0-M5</version><configuration><skipTests>true</skipTests></configuration></plugin></plugins>
</build>

6.5. Maven跳过总结

  • 使用 -DskipTests:跳过测试执行,但编译测试代码。
  • 使用 -Dtest=false:完全跳过测试,不执行任何测试类。
  • 使用 -Dmaven.test.skip=true:完全跳过测试的编译和执行。
  • pom.xml 中配置 maven-surefire-plugin,永久跳过测试。

博文参考

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

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

相关文章

05. Springboot admin集成Actuator(一)

目录 1、前言 2、Actuator监控端点 2.1、健康检查 2.2、信息端点 2.3、环境信息 2.4、度量指标 2.5、日志文件查看 2.6、追踪信息 2.7、Beans信息 2.8、Mappings信息 3、快速使用 2.1、添加依赖 2.2、添加配置文件 2.3、启动程序 4、自定义端点Endpoint 5、自定…

【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵

GESP二级模拟题&#xff0c;多层循环、分支语句练习&#xff0c;难度★✮☆☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-2-luogu-b3995/ 【GESP】C二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵 | OneCoderGESP二级模拟题&#xff0c;多层循环、分…

uniapp在app下使用mqtt协议!!!支持vue3

什么&#xff1f;打包空白&#xff1f;分享一下我的解决方法&#xff01; 第一步 找大师算过了&#xff0c;装4.1版本运气好&#xff01; 所以根目录执行命令… npm install mqtt4.1.0第二步 自己封装一个mqtt文件方便后期开坛做法&#xff01; // utils/mqtt.js import mqt…

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中&#xff0c;C 语言宛如一座巍峨的高山&#xff0c;吸引着无数开发者攀登探索。而 Linux 操作系统&#xff0c;以其开源、稳定、高效的特性&#xff0c;成为了众多开发者钟爱的开发平台。将 C 与 Linux 相结合&#xff0c;就如同为开发者配备了一把无坚不…

【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)

本章将详细介绍四大主流金融数据源&#xff08;Tushare、AkShare、Baostock、通联数据&#xff08;DataAPI&#xff09;&#xff09;&#xff0c;分析其特点与适用场景&#xff0c;并通过实战案例展示数据获取与处理的全流程。 &#x1f449; 点击关注不迷路 &#x1f449; 点击…

一文讲解Redis的持久化方式及各自的区别

一文讲解Redis的持久化方式及各自的区别 Redis 的持久化机制保证了 Redis 服务器在重启后数据不丢失&#xff0c;通过 RDB 和 AOF 文件来恢复内存中原有的数据。 这两种持久化方式可以单独使用&#xff0c;也可以同时使用。 三分恶面渣逆袭&#xff1a;Redis持久化的两种方式…

STM32 利用SysTick实现高精度计时

STM32 HAL库利用ARM Cortex-M内核自带的24位递减计数器SysTick(系统节拍)&#xff0c;它属于 NVIC的一部分,且可以产生 SysTick 异常(异常类型#15)。通过读取并判断计数值来实现精确延时&#xff0c;从0xFFFFFF向下计数到0。可以用作I2C、SPI通信中的时序控制&#xff0c;RTOS环…

图像金字塔

图像金字塔&#xff08;MATLAB 版本&#xff09; 目录 图像金字塔&#xff08;MATLAB 版本&#xff09;一、 生成图像金字塔二、 Matlab实践操作三、实践问题 一、 生成图像金字塔 在 MATLAB 中&#xff0c;可以使用 impyramid 函数来生成图像金字塔。 代码示例&#xff1a; m…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(一)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷&#xff08;一&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书DCRS:DCFW:DCWS:WAF: 第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&…

20250212:https通信

1:防止DNS劫持:使用 https 进行通信。 因为是SDK授权开发,需要尽量压缩so库文件和三方依赖。所以第一想法是使用 head only 的 cpp-httplib 进行开发。 cpp-httplib 需要 SSL 版本是 3.0及以上。但本地已经在开发使用的是1.0.2a版本,不满足需求。 方案1:升级OpenSSL 将Op…

一、C#基础入门课程【学习20天】01-07

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

基于SpringBoot + Vue的共享汽车(单车)管理系统设计与实现+毕业论文+开题报告+指导搭建视频

本系统包含管理员、用户两个角色。 管理员角色&#xff1a;个人中心管理、用户管理、投放地区管理、汽车信息管理、汽车投放管理、汽车入库管理、使用订单管理、汽车归还管理。 用户角色&#xff1a;注册登录、汽车使用下单、汽车归还。 本共享汽车管理系统有管理员和用户。管…

DeepSeek+Kimi生成高质量PPT

DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用&#xff1a;生成结构化PPT大纲&#xff08;擅长逻辑构建与内容优化&#xff09;Kimi核心作用&#xff1a;将文本转换为视觉化PPT&#xff08;提供模板库与排版引擎&#xff09; 二、操作步骤详解 1. 通…

Android KMP初探

Android KMP初探 前言&#xff1a; 最近线上听了Kotlin官网举行的KMP会议&#xff0c;感觉听神奇的&#xff0c;于是就把官方demo下载下来尝试了一下&#xff0c;下载插件和所需要的依赖都用了很久&#xff0c;但是发现里面的代码很少&#xff0c;于是尝试自己手写了一下&…

鸿蒙NEXT应用App测试-通用测试

注意&#xff1a;大家记得学完通用测试记得再学鸿蒙专项测试 https://blog.csdn.net/weixin_51166786/article/details/145768653 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章…

GO 快速升级Go版本

由于底层依赖升级了&#xff0c;那我们也要跟着升&#xff0c;go老版本已经不足满足需求了&#xff0c;必须要将版本升级到1.22.0以上 查看当前Go版本 命令查看go版本 go version [rootlocalhost local]# go version go version go1.21.4 linux/amd64 [rootlocalhost local]# …

Redis——用户签到BitMap,UV统计

目录 BitMap 使用场景 1. 用户签到系统 2. 用户行为标记 3. 布隆过滤器&#xff08;Bloom Filter&#xff09; BitMap介绍 Redis中的使用 Redis功能示例 添加&#xff1a; 获取&#xff1a; 批量获取&#xff1a; java中实现 统计本月连续签到次数 UV统计 UV 统计…

Redis|持久化

文章目录 总体介绍RDB&#xff08;Redis DataBase&#xff09;官网介绍案例演示优势劣势 总体介绍 官网地址&#xff1a;https://redis.io/docs/manual/persistence/ 持久化双雄&#xff1a; RDB&#xff08;Redis DataBase&#xff09;&#xff1a;RDB 是 Redis 默认的持久化…

51单片机编程学习笔记——点亮LED

大纲 器件51单片机开发板总结 安装驱动点亮LED烧录 随着最近机器人爆火&#xff0c;之前写的ROS2系列博客《Robot Operating System》也获得了更多的关注。我决定在机器人领域里再走一步&#xff0c;于是想到可以学习单片机。研究了下学习路径&#xff0c;最后还是选择先从51单…

基于Spring Boot的公司资产网站设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…